<!-- 博客 - 页面布局 > 上中下 -->



<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=dark>
<!-- 博客 - 导航栏上方 -->


<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/blog/img/fluid.png">
  <link rel="icon" href="/blog/img/icon/dw.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="Memory">
  <meta name="keywords" content="">

  
    <meta name="description" content="🚦 离开工位，走进收费站——一位开发者为写出更接地气的代码所做的第一手调研">
<meta property="og:type" content="article">
<meta property="og:title" content="保驾护航——后台运维视角下的高速公路“生命线”">
<meta property="og:url" content="https://test.atomgit.net/blog/2025/10/23/%E4%BF%9D%E9%A9%BE%E6%8A%A4%E8%88%AA%E2%80%94%E2%80%94%E5%90%8E%E5%8F%B0%E8%BF%90%E7%BB%B4%E8%A7%86%E8%A7%92%E4%B8%8B%E7%9A%84%E9%AB%98%E9%80%9F%E5%85%AC%E8%B7%AF%E2%80%9C%E7%94%9F%E5%91%BD%E7%BA%BF%E2%80%9D/index.html">
<meta property="og:site_name" content="Memory&#39;s blog">
<meta property="og:description" content="🚦 离开工位，走进收费站——一位开发者为写出更接地气的代码所做的第一手调研">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://test.atomgit.net/blog/img/artical/window20240821.jpg">
<meta property="article:published_time" content="2025-10-23T14:43:53.000Z">
<meta property="article:modified_time" content="2025-12-04T04:43:53.000Z">
<meta property="article:author" content="Memory">
<meta property="article:tag" content="工作">
<meta property="article:tag" content="日记">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://test.atomgit.net/blog/img/artical/window20240821.jpg">
  
  
  
  <title>保驾护航——后台运维视角下的高速公路“生命线” - Memory&#39;s blog</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/blog/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/blog/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/blog/css/highlight-dark.css" />
  



  
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css">



  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"test.atomgit.net","root":"/blog/","version":"1.9.4","typing":{"enable":true,"typeSpeed":100,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":false,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"follow_dnt":true,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"appId":"T1hUHH9Ks1ggG9DBE3HgUPpV-gzGzoHsz","appKey":"XFkgzzvzNo3J3uNCbBiSOFKc","server_url":"https://t1huhh9k.lc-cn-n1-shared.com","path":"window.location.pathname","ignore_local":false}},"search_path":"/blog/local-search.xml"};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/blog/js/utils.js" ></script>
  <script  src="/blog/js/color-schema.js" ></script>
  

  

  

  

  

  

  

  



  
<meta name="generator" content="Hexo 5.4.2"></head>

<body>
  

  <header>
    <!-- 博客 - 导航栏上方 -->


<div class="header-inner" style="height: 100vh">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/blog/">
      <strong>Memory&#39;s blog</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/">
                <i class="iconfont icon-home-fill"></i>
                <span>首页</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/archives/">
                <i class="iconfont icon-archive-fill"></i>
                <span>归档</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/categories/">
                <i class="iconfont icon-category-fill"></i>
                <span>分类</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/tags/">
                <i class="iconfont icon-tags-fill"></i>
                <span>标签</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/about/">
                <i class="iconfont icon-user-fill"></i>
                <span>关于</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/links/">
                <i class="iconfont icon-link-fill"></i>
                <span>友链</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/playlist/">
                <i class="iconfont icon-music"></i>
                <span>音乐</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/Memos/">
                <i class="iconfont icon-comment "></i>
                <span>说说</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/App/">
                <i class="iconfont icon-mobile"></i>
                <span>咫尺</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" target="_self" href="javascript:;" role="button"
                 data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <i class="iconfont icon-books"></i>
                <span>青简</span>
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="http://47.93.135.62:5230/explore">
                    <i class="iconfont icon-images"></i>
                    <span>碎念微光</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-bug"></i>
                    <span>匠册详析</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-xbox-fill"></i>
                    <span>窗景新编</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-steam"></i>
                    <span>戏码幕后</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-map"></i>
                    <span>他山随拾</span>
                  </a>
                
              </div>
            </li>
          
        
        
            <li class="nav-item" id="search-btn">
                <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalNotice" aria-label="Search">
                    <i class="iconfont icon-book"></i>
                    <span>公告</span>
                </a>
            </li>
            
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              <i class="iconfont icon-search"></i>
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
              <i class="iconfont icon-dark" id="color-toggle-icon"></i>
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>
 
<div id="banner" class="banner" parallax=true
     style="background: url('/blog/img/artical/window20240821.jpg') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">

    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">

        <div class="h2">
          
            <span id="subtitle" data-typed-text="保驾护航——后台运维视角下的高速公路“生命线”"></span>
          
        </div>


        
          <!-- 文章页面 - 顶部信息 -->

<div class="mt-3">
  
  <span class="post-meta mr-2">
    <i class="iconfont icon-author" aria-hidden="true"></i>
    Memory
  </span>
   
  <span class="post-meta">
    <i class="iconfont icon-date-fill" aria-hidden="true"></i>
    <time datetime="2025-10-23 22:43" pubdate>
      2025年10月23日 晚上
    </time>
  </span>
  
</div>

<div class="mt-1">
  
  <span class="post-meta mr-2">
    <i class="iconfont icon-chart"></i>
     125k 字 
  </span>
   
  <span class="post-meta mr-2">
    <i class="iconfont icon-clock-fill"></i>
       312 分钟 
  </span>
     
  <span
    id="leancloud-page-views-container"
    class="post-meta"
    style="display: none"
  >
    <i class="iconfont icon-eye" aria-hidden="true"></i>
    <span id="leancloud-page-views"></span> 次
  </span>

    
</div>


        

        <!-- 添加网站运行时间 -->
        <div class="footer-content" style="background-color: transparent;">
          <div>
            <span id="timeDate"></span>
            <span id="times"></span>
            <script>
            var now = new Date();
            function createtime(){
                var grt= new Date("03/07/2023 00:00:00");//此处修改你的建站时间或者网站上线时间
                now.setTime(now.getTime()+250);
                days = (now - grt ) / 1000 / 60 / 60 / 24;
                dnum = Math.floor(days);
                hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum);
                hnum = Math.floor(hours);
                if(String(hnum).length ==1 ){
                    hnum = "0" + hnum;
                }
                minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum);
                mnum = Math.floor(minutes);
                if(String(mnum).length ==1 ){
                          mnum = "0" + mnum;
                }
                seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
                snum = Math.round(seconds);
                if(String(snum).length ==1 ){
                          snum = "0" + snum;
                }
                document.getElementById("timeDate").innerHTML = "🚀 &nbsp"+dnum+"&nbsp天";  //此次自定义显示内容
                document.getElementById("times").innerHTML = hnum + "&nbsp小时&nbsp" + mnum + "&nbsp分&nbsp" + snum + "&nbsp秒";
            }  

            if (!window.location.href.includes('/20')) {  
            setInterval("createtime()", 250);  // 只有当URL不包含'specific-page'时，才调用createtime  
            }//此次自定义显示内容
            </script>
          </div>
        </div>

      </div>
      
        <div class="scroll-down-bar">
          <i class="iconfont icon-arrowdown"></i>
        </div>
      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      <!-- 文章页  -->


<div class="container-fluid nopadding-x">

  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar category-bar" style="margin-right: -1rem">
    <!-- 文章页面 - 左边栏所属分类 -->
  

<!-- 文章页 - 文章分类 -->





<div class="category-list">
  
  
    
    
    
    <div class="category row nomargin-x">
      <a class="category-item 
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="代码锋芒"
        id="heading-843238cb7c4b39b52e95311733ff6da6" role="tab" data-toggle="collapse" href="#collapse-843238cb7c4b39b52e95311733ff6da6"
        aria-expanded="true"
      >
        代码锋芒
        <span class="list-group-count">(31)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse show" id="collapse-843238cb7c4b39b52e95311733ff6da6"
           role="tabpanel" aria-labelledby="heading-843238cb7c4b39b52e95311733ff6da6">
        
        
          
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2023/03/19/MySQL%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/" title="MySQL安装配置"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">MySQL安装配置</span>
        </a>
      
    
      
      
        <a href="/blog/2023/03/22/MySQL%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%85%A5%E5%9C%9F/" title="MySQL从入门到入土"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">MySQL从入门到入土</span>
        </a>
      
    
      
      
        <a href="/blog/2023/04/09/Java%E6%B3%9B%E5%9E%8B%E7%9A%84%E7%90%86%E8%A7%A3/" title="Java泛型：赋予灵活性的利器"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">Java泛型：赋予灵活性的利器</span>
        </a>
      
    
      
      
        <a href="/blog/2023/05/21/%E6%8E%A2%E7%B4%A2%20Python%20%E7%88%AC%E8%99%AB%E7%9A%84%E6%97%A0%E9%99%90%E5%8F%AF%E8%83%BD%E6%80%A7%EF%BC%9A%E5%9F%BA%E7%A1%80%E4%B8%8E%E5%BA%94%E7%94%A8/" title="探索Python爬虫的无限可能性：基础与应用"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">探索Python爬虫的无限可能性：基础与应用</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/03/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84%20JavaWeb%20%E4%B9%8B%E6%97%85/" title="从零开始的 JavaWeb 之旅"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">从零开始的 JavaWeb 之旅</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/10/%E6%95%B0%E6%8D%AE%E5%BA%93-%E5%AE%8C%E6%95%B4%E6%80%A7%E7%BA%A6%E6%9D%9F/" title="数据库-完整性约束"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">数据库-完整性约束</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/24/%E4%BD%BF%E7%94%A8%20JSP%20%E6%9E%84%E5%BB%BA%20JavaWeb%20%E9%A1%B9%E7%9B%AE-%E4%BB%A5%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%A7%E4%BD%9C%E4%B8%9A%E4%B8%BA%E4%BE%8B/" title="使用JSP构建JavaWeb项目--以数据库大作业为例"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">使用JSP构建JavaWeb项目--以数据库大作业为例</span>
        </a>
      
    
      
      
        <a href="/blog/2023/07/06/%E6%89%93%E9%80%A0%E6%B5%81%E7%95%85%E7%BC%96%E7%A0%81%E4%B9%8B%E6%97%85%EF%BC%9AIntelliJ%20IDEA%20%E7%9A%84%E9%AB%98%E6%95%88%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7%E4%B8%8E%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B%E4%BC%98%E5%8C%96/" title="打造流畅编码之旅：IntelliJ IDEA 的高效使用技巧与工作流程优化"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">打造流畅编码之旅：IntelliJ IDEA 的高效使用技巧与工作流程优化</span>
        </a>
      
    
      
      
        <a href="/blog/2023/07/06/%E5%87%A4%E5%87%B0%E6%B6%85%E6%A7%83%EF%BC%9ASpring%20Boot%20%E5%BC%80%E5%8F%91%E4%B9%8B%E8%B7%AF%E4%B8%8A%E7%9A%84%E5%9D%8E%E5%9D%B7%E4%B8%8E%E6%88%90%E9%95%BF/" title="凤凰涅槃：Spring Boot 开发之路上的坎坷与成长"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">凤凰涅槃：Spring Boot 开发之路上的坎坷与成长</span>
        </a>
      
    
      
      
        <a href="/blog/2023/07/11/%E4%BB%8EIP%E5%88%B0Ping%E5%91%BD%E4%BB%A4%EF%BC%9A%E4%BA%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%9F%BA%E7%A1%80/" title="从IP到Ping命令：了解计算机网络连接的基础"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">从IP到Ping命令：了解计算机网络连接的基础</span>
        </a>
      
    
      
      
        <a href="/blog/categories/%E4%BB%A3%E7%A0%81%E9%94%8B%E8%8A%92/" class="list-group-item list-group-item-action">
          <span class="category-post">More...</span>
        </a>
        
  </div>

          
  
    
    
    
    <div class="category-sub row nomargin-x">
      <a class="category-subitem collapsed
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="职路星火"
        id="heading-59c550454d1ecf67a2ead26a1c46d14b" role="tab" data-toggle="collapse" href="#collapse-59c550454d1ecf67a2ead26a1c46d14b"
        aria-expanded="false"
      >
        职路星火
        <span class="list-group-count">(2)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse " id="collapse-59c550454d1ecf67a2ead26a1c46d14b"
           role="tabpanel" aria-labelledby="heading-59c550454d1ecf67a2ead26a1c46d14b">
        
        
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2024/03/07/%E7%A0%BA%E5%89%91%E5%87%BA%E9%9E%98%EF%BC%9A%E6%88%91%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%B1%82%E8%81%8C%E4%B9%8B%E6%97%85/" title="砺剑出鞘：我的软件工程师求职之旅"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">砺剑出鞘：我的软件工程师求职之旅</span>
        </a>
      
    
      
      
        <a href="/blog/2024/04/16/%E6%8B%A8%E4%BA%91%E8%A7%81%E6%97%A5%EF%BC%9A%E8%81%8C%E5%9C%BA%E7%94%9F%E6%B4%BB%E7%9A%84%E7%82%B9%E6%BB%B4%E8%AE%B0%E5%BD%95/" title="拨云见日：职场生活的点滴记录"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">拨云见日：职场生活的点滴记录</span>
        </a>
      
    
  </div>

        
      </div>
    </div>
  
    
    
    
    <div class="category-sub row nomargin-x">
      <a class="category-subitem 
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="部署之道"
        id="heading-36acf247b1a64f4bbe423776a392cfde" role="tab" data-toggle="collapse" href="#collapse-36acf247b1a64f4bbe423776a392cfde"
        aria-expanded="true"
      >
        部署之道
        <span class="list-group-count">(5)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse show" id="collapse-36acf247b1a64f4bbe423776a392cfde"
           role="tabpanel" aria-labelledby="heading-36acf247b1a64f4bbe423776a392cfde">
        
        
          
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2023/06/22/Nginx%20%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97%EF%BC%9A%E7%90%86%E8%A7%A3%E3%80%81%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BC%98%E5%8C%96/" title="Nginx 入门指南：理解、配置和优化"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">Nginx 入门指南：理解、配置和优化</span>
        </a>
      
    
      
      
        <a href="/blog/2023/07/11/Docker%20%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%EF%BC%9A%E5%BF%AB%E9%80%9F%E6%89%93%E9%80%A0%E9%AB%98%E6%95%88%E7%BD%91%E7%AB%99%E9%83%A8%E7%BD%B2%E7%8E%AF%E5%A2%83/" title="Docker入门与实践：快速打造高效网站部署环境"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">Docker入门与实践：快速打造高效网站部署环境</span>
        </a>
      
    
      
      
        <a href="/blog/2023/08/17/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20API%20%E7%BD%91%E5%85%B3%EF%BC%9A%E5%8E%9F%E7%90%86%E3%80%81%E5%8A%9F%E8%83%BD%E5%92%8C%E7%94%A8%E9%80%94/" title="深入理解 API 网关：原理、功能和用途"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">深入理解 API 网关：原理、功能和用途</span>
        </a>
      
    
  </div>

          
  
    
    
    
    <div class="category-sub row nomargin-x">
      <a class="category-subitem 
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="职路星火"
        id="heading-59c550454d1ecf67a2ead26a1c46d14b" role="tab" data-toggle="collapse" href="#collapse-59c550454d1ecf67a2ead26a1c46d14b"
        aria-expanded="true"
      >
        职路星火
        <span class="list-group-count">(2)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse show" id="collapse-59c550454d1ecf67a2ead26a1c46d14b"
           role="tabpanel" aria-labelledby="heading-59c550454d1ecf67a2ead26a1c46d14b">
        
        
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2024/12/16/%E6%BC%AB%E6%BC%AB%E5%BE%81%E9%80%94%EF%BC%9A%E7%AD%91%E6%A2%A6%E4%BA%8E%E8%81%8C%E5%9C%BA%E9%A3%8E%E9%9B%A8%EF%BC%8C%E5%90%9F%E5%92%8F%E4%BA%8E%E6%97%A5%E5%B8%B8%E8%AF%97%E6%84%8F/" title="漫漫征途：筑梦于职场风雨，吟咏于日常诗意"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">漫漫征途：筑梦于职场风雨，吟咏于日常诗意</span>
        </a>
      
    
      
      
        <a href="/blog/2025/10/23/%E4%BF%9D%E9%A9%BE%E6%8A%A4%E8%88%AA%E2%80%94%E2%80%94%E5%90%8E%E5%8F%B0%E8%BF%90%E7%BB%B4%E8%A7%86%E8%A7%92%E4%B8%8B%E7%9A%84%E9%AB%98%E9%80%9F%E5%85%AC%E8%B7%AF%E2%80%9C%E7%94%9F%E5%91%BD%E7%BA%BF%E2%80%9D/" title="保驾护航——后台运维视角下的高速公路“生命线”"
           class="list-group-item list-group-item-action
           active">
          <span class="category-post">保驾护航——后台运维视角下的高速公路“生命线”</span>
        </a>
      
    
  </div>

        
      </div>
    </div>
  
        
      </div>
    </div>
  
    
    
    
    <div class="category-sub row nomargin-x">
      <a class="category-subitem collapsed
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="项目志录"
        id="heading-005e56101bc2a873707cb4461a70ded8" role="tab" data-toggle="collapse" href="#collapse-005e56101bc2a873707cb4461a70ded8"
        aria-expanded="false"
      >
        项目志录
        <span class="list-group-count">(1)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse " id="collapse-005e56101bc2a873707cb4461a70ded8"
           role="tabpanel" aria-labelledby="heading-005e56101bc2a873707cb4461a70ded8">
        
        
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2023/07/30/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB%EF%BC%9A%E8%B8%A9%E5%9D%91%E6%8C%87%E5%8D%97%E4%B8%8E%E6%8A%80%E5%B7%A7%E6%80%BB%E7%BB%93/" title="小程序开发经验分享：踩坑指南与技巧总结"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">小程序开发经验分享：踩坑指南与技巧总结</span>
        </a>
      
    
  </div>

        
      </div>
    </div>
  
        
      </div>
    </div>
  
</div>

  </aside>


    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">保驾护航——后台运维视角下的高速公路“生命线”</h1>
            
              <p class="note note-success">
                
                  
                    本文最后更新于：4 天前
                  
                
              </p>
            
            
              <div class="markdown-body">
                
                <h1 id="罗芬科技"><a href="#罗芬科技" class="headerlink" title="罗芬科技"></a>罗芬科技</h1><h2 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h2><blockquote>
<p>2025 年 12 月 3 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.runoob.com/flask/flask-tutorial.html">Flask 教程 | 菜鸟教程</a></p>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2230800">【超实用】3 分钟，教你用 Docker 部署一个 Python 应用！-腾讯云开发者社区-腾讯云</a></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask<br>app = Flask(__name__)<br><br><span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&#x27;/&#x27;</span></span>)</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">index</span>():<br>    <span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Hello World!&quot;</span><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    app.run(host=<span class="hljs-string">&quot;0.0.0.0&quot;</span>, port=<span class="hljs-number">5000</span>,debug=<span class="hljs-literal">True</span>)<br></code></pre></td></tr></table></figure>

<p>显而易见，就是一个非常基础的项目，当我们在浏览器输入网址以及对应的端口号的时候，会返回“Hello World!”内容。</p>
<p>执行以下命令安装可能缺失的依赖。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">pip install Flask<br></code></pre></td></tr></table></figure>

<p>运行成功，访问成功。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">C:\Users\Lenovo\AppData\Local\Programs\Python\Python314\python.exe D:\Project\python\python通讯\python测试\test1203.py <br> * Serving Flask app <span class="hljs-string">&#x27;test1203&#x27;</span><br> * Debug mode: on<br>WARNING: This is a development server. Do not use it <span class="hljs-keyword">in</span> a production deployment. Use a production WSGI server instead.<br> * Running on all addresses (0.0.0.0)<br> * Running on http://127.0.0.1:5000<br> * Running on http://192.168.1.105:5000<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/yp25805488/article/details/151755803">Python Flask 项目实战_python flask项目-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://www.runoob.com/flask/flask-tutorial.html">Flask 教程 | 菜鸟教程</a></p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile"><span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.8</span>-slim<br><br><span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span><br><br><span class="hljs-keyword">COPY</span><span class="language-bash"> requirements.txt requirements.txt</span><br><span class="hljs-keyword">RUN</span><span class="language-bash"> pip install -r requirements.txt</span><br><br><span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span><br><br><span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;gunicorn&quot;</span>, <span class="hljs-string">&quot;-b&quot;</span>, <span class="hljs-string">&quot;0.0.0.0:8000&quot;</span>, <span class="hljs-string">&quot;app:app&quot;</span>]</span><br></code></pre></td></tr></table></figure>

<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile"><span class="hljs-keyword">COPY</span><span class="language-bash"> requirements.txt requirements.txt</span><br><span class="hljs-keyword">RUN</span><span class="language-bash"> pip install -r requirements.txt</span><br></code></pre></td></tr></table></figure>

<h2 id="触摸屏"><a href="#触摸屏" class="headerlink" title="触摸屏"></a>触摸屏</h2><blockquote>
<p>2025 年 12 月 5 日</p>
</blockquote>
<p>今天务必把所有必须的 Python 程序全部编写运行并测试完毕。</p>
<p>罢了，今中午得去一趟调试顶棚灯，这程序谁爱写谁写去，看有时间再完善下吧，目前都是模拟数据没有从指定数据库中获取。</p>
<blockquote>
<p>2025 年 12 月 4 日</p>
</blockquote>
<p>他妈的刚发现电脑的USB转TTL模块怎么不亮了，这样接笔记本的串口屏也跟着亮不起来了对吧。</p>
<p>昨天下半前不整挺好的么，我拿着鼠标和转录模块的USB口调换一下，妈的现在连鼠标都动不了了，电脑USB口给这个插口搞坏掉了吧。</p>
<p>艹。</p>
<p>折腾了快一个小时，这个模块上有个黑色的滑块按钮，分别是用来开关USB转TTL模块电源的，开了就没事了。</p>
<p>用手机充电器也行，还是买个专用的 12V2A 电源适配器，四十块钱左右。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">2025</span>/<span class="hljs-number">12</span>/<span class="hljs-number">04</span> <span class="hljs-number">10</span>:<span class="hljs-number">25</span>:<span class="hljs-number">47</span><br></code></pre></td></tr></table></figure>

<p>encode 选择 gbk 和 gb2312，这两个字体竟然有细微差别吗，选择 gbk 编码的汉字字体至少在模拟器和串口屏上显示更清晰点。</p>
<p>用手机充电器也行，还是买个专用的 12V2A 电源适配器，四十块钱左右。</p>
<p>十一点半，基本完善全部五个页面，接下来就是Python脚本了，今早听他们沟通结果应该是要调整串口屏尺寸大小，完事了还得写什么测试文档开发文档。</p>
<p>明天去车道干啥。。</p>
<blockquote>
<p>2025 年 12 月 3 日</p>
</blockquote>
<p>新增字库，指定字符，要不这字库文件加起来就有10MB，下载到串口屏都报错了。</p>
<figure class="highlight delphi"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs delphi"><span class="hljs-keyword">File</span> <span class="hljs-keyword">is</span> too large <span class="hljs-keyword">for</span> destination device.<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/QA/QA44.html">报错:file is too large for destination device — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p>数据库还没有拿到，先编写除了数据库连接以外的 Python 监听程序吧。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_67336587/article/details/125236607">python出现PEP 8: E302 expected 2 blank lines, 问题和IndentationError：unexpected indent问题_pep 8: e302 expected 2 blank lines, found 1-CSDN博客</a></p>
<p>基本完善了首页指令收发逻辑。</p>
<p>启动监听。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 使用示例</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():<br>    <span class="hljs-comment"># 创建数据填充器实例</span><br>    hmi_filler = HMIDataFiller(port=<span class="hljs-string">&#x27;COM5&#x27;</span>, baudrate=<span class="hljs-number">115200</span>)<br><br>    <span class="hljs-keyword">try</span>:<br>        <span class="hljs-comment"># 连接串口屏</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> hmi_filler.connect():<br>            <span class="hljs-keyword">return</span><br><br>        <span class="hljs-comment"># 跳转至主页面（页面0）</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> hmi_filler.navigate_to_page(<span class="hljs-number">0</span>):<br>            logger.error(<span class="hljs-string">&quot;无法跳转到主页面&quot;</span>)<br>            <span class="hljs-keyword">return</span><br><br>        <span class="hljs-comment"># 单次更新所有控件数据</span><br>        logger.info(<span class="hljs-string">&quot;开始更新页面数据...&quot;</span>)<br>        success = hmi_filler.update_all_controls()<br><br>        <span class="hljs-keyword">if</span> success:<br>            logger.info(<span class="hljs-string">&quot;数据更新完成&quot;</span>)<br><br>            <span class="hljs-comment"># 询问是否启动定时更新</span><br>            user_input = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;是否启动定时更新？(y/n): &quot;</span>)<br>            <span class="hljs-keyword">if</span> user_input.lower() == <span class="hljs-string">&#x27;y&#x27;</span>:<br>                interval = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入更新间隔（秒）: &quot;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&quot;30&quot;</span>)<br>                hmi_filler.start_periodic_update(interval)<br>        <span class="hljs-keyword">else</span>:<br>            logger.error(<span class="hljs-string">&quot;数据更新失败&quot;</span>)<br><br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        logger.error(<span class="hljs-string">f&quot;程序执行出错: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>    <span class="hljs-keyword">finally</span>:<br>        hmi_filler.close()<br></code></pre></td></tr></table></figure>

<p>今下午把所有页面基本写完，模拟数据也搞上，还可以进一步尝试下把 Python 程序给部署到服务器上，还没试过。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">我有个问题还想问，就是现在本机编写的Python程序能够监听到本机串口屏，能发送信号到串口屏也能接受来自串口屏的信号，那么将来呢，将来在生产环境下，是不是得在连接串口屏的那台主机上把这套Python代码运行起来呢，思路是这样的吧。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/kfsf121/article/details/114869568">docker 部署python项目（实战）_docker部署python项目-CSDN博客</a></p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">CPU35</span>% 内存<span class="hljs-number">90</span>%(容量<span class="hljs-number">32</span>G|已用<span class="hljs-number">25</span>G|剩余<span class="hljs-number">17</span>G) 磁盘<span class="hljs-number">70</span>%(容量<span class="hljs-number">32</span>G|已用<span class="hljs-number">25</span>G|剩余<span class="hljs-number">17</span>G) 网络流量(上行<span class="hljs-number">1</span>M/s|下行<span class="hljs-number">1</span>M/s)<br></code></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 第一对：t25（服务名）和 t24（状态）</span><br>           commands.append(<span class="hljs-string">f&#x27;t8.txt=&quot;<span class="hljs-subst">&#123;services[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;name&quot;</span>]&#125;</span>&quot;&#x27;</span>)<br>           status_text1 = <span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;services[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;status&quot;</span>]&#125;</span>&#x27;</span><br>           status_color1 = color_map.get(services[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;status&quot;</span>])<br>           <span class="hljs-comment"># 设置状态文本和颜色</span><br>           commands.append(<span class="hljs-string">f&#x27;t25.txt=&quot;<span class="hljs-subst">&#123;status_text1&#125;</span>&quot;&#x27;</span>)<br>           commands.append(<span class="hljs-string">f&#x27;t25.pco=<span class="hljs-subst">&#123;status_color1&#125;</span>&#x27;</span>)<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 12 月 2 日</p>
</blockquote>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">写了些测试页面，笔记本用转接模块连接串口屏，本地Python程序能监听到串口屏控件发来的触发信号，Python程序也能发送指令操作串口屏<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">你找找产品，我们有个触摸屏的软件，原来是普通web项目，要改成串口屏<br></code></pre></td></tr></table></figure>

<p>串口屏开发应该选择什么编码？</p>
<table>
<thead>
<tr>
<th align="left">编码格式</th>
<th align="left">适用场景</th>
<th align="left">优点</th>
<th align="left">缺点</th>
<th align="left">推荐指数</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>GB2312</strong></td>
<td align="left">简体中文环境</td>
<td align="left">兼容性好，体积小</td>
<td align="left">不支持繁体，字符集有限</td>
<td align="left">⭐⭐⭐⭐</td>
</tr>
<tr>
<td align="left"><strong>GBK</strong></td>
<td align="left">中文字符扩展</td>
<td align="left">支持更多汉字，兼容GB2312</td>
<td align="left">非国际标准</td>
<td align="left">⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td align="left"><strong>UTF-8</strong></td>
<td align="left">国际化项目</td>
<td align="left">全球通用，支持所有语言</td>
<td align="left">体积稍大，部分老设备兼容性差</td>
<td align="left">⭐⭐⭐⭐</td>
</tr>
<tr>
<td align="left"><strong>ASCII</strong></td>
<td align="left">纯英文环境</td>
<td align="left">体积最小，兼容性最好</td>
<td align="left">不支持中文</td>
<td align="left">⭐⭐</td>
</tr>
<tr>
<td align="left"><strong>Big5</strong></td>
<td align="left">繁体中文环境</td>
<td align="left">台湾香港地区标准</td>
<td align="left">不支持简体中文</td>
<td align="left">⭐⭐</td>
</tr>
<tr>
<td align="left"><strong>Shift-JIS</strong></td>
<td align="left">日文环境</td>
<td align="left">日本地区专用</td>
<td align="left">仅限日文项目</td>
<td align="left">⭐</td>
</tr>
</tbody></table>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">智能物联监测终端背景<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://ibaotu.com/">包图网-正版商用视频音乐素材库，AI设计图片|PPT模板|海报|背景元素，会员免费下载</a></p>
<p><a target="_blank" rel="noopener" href="https://www.58pic.com/">千图网-免费在线设计图片素材网站-正版商用素材图库模板大全</a></p>
<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_5063421295000153909&sourceFrom=search_a">ps快速修改尺寸和分辨率 超级简单版</a></p>
<p>妈的这个尺寸下的字体大小，最小字体高度也得是16，屏幕尺寸不大这字体显得就臃肿了，先按照这样的大小设置吧。</p>
<h2 id="Debian"><a href="#Debian" class="headerlink" title="Debian"></a>Debian</h2><blockquote>
<p>2025 年 12 月 2 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.debian.org/distrib/netinst">从网络安装 Debian</a></p>
<p><a target="_blank" rel="noopener" href="https://mirror.accum.se/cdimage/archive/10.13.0/amd64/">Index of /cdimage/archive/10.13.0/amd64</a></p>
<h2 id="加速器"><a href="#加速器" class="headerlink" title="加速器"></a>加速器</h2><blockquote>
<p>2025 年 12 月 2 日</p>
</blockquote>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">其实加速软件原理很简单，就是利用VPN技术，用户通过一台登陆服务器用加速软件商提供的账号密码拨号登陆到一台具有双线带宽的服务器上（专业术语叫：节点服务器）并与之建立连接并改变当前（即本机的上网环境）网络环境。在访问的时候，将本机访问的目标（例如：一个网址）通过节点服务器转发一次，从而完成加速效果。<br></code></pre></td></tr></table></figure>

<h2 id="城乡医保"><a href="#城乡医保" class="headerlink" title="城乡医保"></a>城乡医保</h2><blockquote>
<p>2025 年 12 月 1 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MjM5OTY4Mzk1OA==&mid=2649937663&idx=5&sn=c66d6321640982c3d9873d68f9fc72d9&chksm=be4527fe3a47563b772e552c04fb7a5d19aa15841ae4b6537f5b4dc3944a12a1749ee21a7900&scene=27">“职工医保”VS“居民医保”，六不同！看完就懂→</a></p>
<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4487807914037542538&sourceFrom=search_a">职工医保VS居民医保，有啥区别？交哪个好</a></p>
<p>城乡医保交一年保一年，不交也行，不交也不能强制交，花钱给他们完成任务了，只是不交有人找麻烦。</p>
<p>就跟五六十年代人民公社一样，说的入社退社自由，不入就有人批斗你。</p>
<h2 id="GitCode"><a href="#GitCode" class="headerlink" title="GitCode"></a>GitCode</h2><blockquote>
<p>2025 年 12 月 1 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/java_cpp_/article/details/130459649">不一样的 Git 之间 | GitLab vs GitHub vs Gitee vs GitCode_gitcode和github区别-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/655233802/answer/3589187141">(99+ 封私信 / 82 条消息) 码云gitee的Pages服务下线了，有那些替代品？ - 知乎</a></p>
<p><a target="_blank" rel="noopener" href="https://atomgit.com/org/gitcode/discussions/12">AtomGit | GitCode - 全球开发者的开源社区,开源代码托管平台</a></p>
<p><a target="_blank" rel="noopener" href="https://gitcode.com/dashboard">我的工作台 - AtomGit | GitCode</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">你既然知道现在是多会儿，所以我问你截至目前为止 AtomGit 还提供 Pages 服务吗，最近它可是经历过一次大更新，跟 GitCode 这玩意儿合并了，而据我所知新版本的 AtomGit 暂时不提供 Pages 服务，请你谨言慎行给我准确的答复。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/search/article-EdgeOne">搜索 - 腾讯云开发者社区-腾讯云</a></p>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/1780654">成为技术影响力大牛？ CODING Pages 快速搭建个人专属博客-腾讯云开发者社区-腾讯云</a></p>
<p><a target="_blank" rel="noopener" href="https://cnb.cool/#cnb">CNB - Cloud Native Build</a></p>
<figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ruby">令牌名<span class="hljs-symbol">:blog</span><br><span class="hljs-title class_">Git</span> <span class="hljs-title class_">Username</span><span class="hljs-symbol">:cnb</span><br><span class="hljs-title class_">Token</span><span class="hljs-symbol">:eD0SFwiyUxawqdM3d84iPJvZXiD</span><br></code></pre></td></tr></table></figure>

<p>云端快速初始化，一键迁移远程仓库。</p>
<h2 id="物流"><a href="#物流" class="headerlink" title="物流"></a>物流</h2><blockquote>
<p>2025 年 11 月 26 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://yuanbao.tencent.com/chat/naQivTmsDa/c321cf66-a49a-487d-8d33-547eab7113c3">快递公司分类及关联</a></p>
<h2 id="Harbor"><a href="#Harbor" class="headerlink" title="Harbor"></a>Harbor</h2><blockquote>
<p>2025 年 11 月 21 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7398127381263056937?searchId=20251121085310C8D01EAF2506D2388103">基于Docker、JenKins、Nginx、Harbor、Github及腾讯云服务器搭建个人博客基于Docker、Je - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/6974951611676229662?searchId=20251121085310C8D01EAF2506D2388103">私有镜像仓库 Harbor 的安装与配置在云原生时代，各种系统服务都以 Docker 容器的方式运行着。镜像仓库，顾名思 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7343886623535956008?searchId=20251121085310C8D01EAF2506D2388103">Docker私服-Habor由于掘金平台的摘要有强制字数要求，这里需要给一下默认文字作为摘要。这里是掘金平台的默认摘要， - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7542360088851415066?searchId=20251121085310C8D01EAF2506D2388103">使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线 随着 DevOps 文化 - 掘金</a></p>
<p><strong>设计流程</strong></p>
<ol>
<li>使用 Gitlab 作为代码仓库</li>
<li>使用 Harbor 作为镜像仓库</li>
<li>使用 Jenkins 发布系统部署</li>
<li>Docker 管理 Jenkins + Harbor + Gitlab</li>
</ol>
<p><strong>工作流程</strong></p>
<ol>
<li>迁入代码 push 到 Gitlab</li>
<li>Gitlab 触发 webhook 的 push 触发事件并主动通知 Jenkins 构建</li>
<li>Jenkins 在 Gitlab 获取源码并通过配置好的规则与 shell 脚本进行构建</li>
</ol>
<p>如果是工具库，则 dotnet push 到私有 Nuget；</p>
<p>如果是 Web 应用，则通过 dockerfile 构建 docker 镜像并 push 到 Docker Registry，然后由 docker swarm create 多节点</p>
<h2 id="交换机"><a href="#交换机" class="headerlink" title="交换机"></a>交换机</h2><blockquote>
<p>2025 年 11 月 20 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1843784020211858641&wfr=spider&for=pc">什么是交换机</a></p>
<h2 id="IP-盒子"><a href="#IP-盒子" class="headerlink" title="IP 盒子"></a>IP 盒子</h2><blockquote>
<p>2025 年 12 月 5 日</p>
</blockquote>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo su -<br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sudo chown loongson:loongson <span class="hljs-regexp">/home/</span>loongson<span class="hljs-regexp">/package/</span><br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sudo chown root:root <span class="hljs-regexp">/home/</span>loongson<span class="hljs-regexp">/package/</span><br></code></pre></td></tr></table></figure>

<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">dpkg</span> -i ./i386-runtime-base_1.<span class="hljs-number">2</span>.<span class="hljs-number">1</span>~<span class="hljs-number">20230714</span>.lnd.<span class="hljs-number">1</span>_loongarch64.deb<br></code></pre></td></tr></table></figure>

<figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs haxe">tar -zxvf lat-<span class="hljs-keyword">new</span><span class="hljs-type"></span>-c4055e9.tar.gz<br></code></pre></td></tr></table></figure>



<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">export</span> LD <span class="hljs-attribute">LIBRARY_PATH</span>=`pwd`:$LD_LIBRARY_PATH<br></code></pre></td></tr></table></figure>



<blockquote>
<p>2025 年 11 月 27 日</p>
</blockquote>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">sudo systemctl status ssh</span><br></code></pre></td></tr></table></figure>

<p>**如果看到 <code>Unit ssh.service not found</code>**：说明系统未安装SSH服务器。需要安装：</p>
<figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">sudo apt <span class="hljs-keyword">update</span><br>sudo apt install openssh-<span class="hljs-keyword">server</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">uname</span> -m<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://mirrors.aliyun.com/ubuntu-ports/pool/main/o/openssh/">https://mirrors.aliyun.com/ubuntu-ports/pool/main/o/openssh/</a></p>
<p><a target="_blank" rel="noopener" href="https://mirrors.aliyun.com/ubuntu-ports/pool/main/o/openssh/">ubuntu-ports-pool-main-o-openssh安装包下载_开源镜像站-阿里云</a></p>
<p><a target="_blank" rel="noopener" href="https://ports.ubuntu.com/pool/main/o/openssh/">Index of /pool/main/o/openssh</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/zhengshaolin128/article/details/142425956">银河麒麟桌面操作系统V10（SP1）离线升级SSH(OpenSSH)服务_麒麟系统离线安装ssh-CSDN博客</a></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo apt update<br>sudo apt install net-tools<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ssh loongson@192.168.1.112<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2502247">网工必懂！路由器、光猫、交换机三大设备大揭秘，区别你分得清吗？-腾讯云开发者社区-腾讯云</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1800265950359921533&wfr=spider&for=pc">分不清路由器、交换机、光猫的概念，一文带你迅速搞懂！</a></p>
<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4409574461592485948&sourceFrom=search_a">光猫路由器傻傻分不清？看完这篇稳如老狗</a></p>
<p><a target="_blank" rel="noopener" href="https://developer.aliyun.com/article/1496172">分不清路由器、交换机、光猫的概念，一文带你迅速搞懂！-阿里云开发者社区</a></p>
<blockquote>
<p>2025 年 11 月 26 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/QingTian1024/article/details/143633842">麒麟服务器操作系统–网络配置的五种方式_麒麟系统配置网卡ip地址-CSDN博客</a></p>
<blockquote>
<p>2025 年 11 月 25 日</p>
</blockquote>
<figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs accesslog"><span class="hljs-number">192.168.2.11</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">root</span><br><span class="hljs-attribute">root</span><br></code></pre></td></tr></table></figure>

<p>本机网段：192.168.2.209</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ssh root@192.168.2.11<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs bash">C:\WINDOWS\system32&gt;ssh root@192.168.2.11<br>The authenticity of host <span class="hljs-string">&#x27;192.168.2.11 (192.168.2.11)&#x27;</span> can<span class="hljs-string">&#x27;t be established.</span><br><span class="hljs-string">ED25519 key fingerprint is SHA256:wp0SoWD7JGL0Ce2wZcmRpRROghrusveXUGXs+Kj1ex4.</span><br><span class="hljs-string">This key is not known by any other names.</span><br><span class="hljs-string">Are you sure you want to continue connecting (yes/no/[fingerprint])? y</span><br><span class="hljs-string">Please type &#x27;</span><span class="hljs-built_in">yes</span><span class="hljs-string">&#x27;, &#x27;</span>no<span class="hljs-string">&#x27; or the fingerprint: yes</span><br><span class="hljs-string">Warning: Permanently added &#x27;</span>192.168.2.11<span class="hljs-string">&#x27; (ED25519) to the list of known hosts.</span><br><span class="hljs-string">root@192.168.2.11&#x27;</span>s password:<br>Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.70-00002-g5d231ff aarch64)<br><br> * Documentation:  https://help.ubuntu.com<br> * Management:     https://landscape.canonical.com<br> * Support:        https://ubuntu.com/advantage<br><br>This system has been minimized by removing packages and content that are<br>not required on a system that <span class="hljs-built_in">users</span> <span class="hljs-keyword">do</span> not <span class="hljs-built_in">log</span> into.<br><br>To restore this content, you can run the <span class="hljs-string">&#x27;unminimize&#x27;</span> <span class="hljs-built_in">command</span>.<br>Last login: Tue Nov 25 13:08:34 2025<br></code></pre></td></tr></table></figure>

<p><strong>查看已识别的串口设备。</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">ls</span> /dev/tty*<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@imx8mp:~<span class="hljs-comment"># ls /dev/tty*</span><br>/dev/tty    /dev/tty19  /dev/tty3   /dev/tty40  /dev/tty51  /dev/tty62    /dev/ttyp6  /dev/ttyS2     /dev/ttysWK22<br>/dev/tty0   /dev/tty2   /dev/tty30  /dev/tty41  /dev/tty52  /dev/tty63    /dev/ttyp7  /dev/ttyS3     /dev/ttysWK23<br>/dev/tty1   /dev/tty20  /dev/tty31  /dev/tty42  /dev/tty53  /dev/tty7     /dev/ttyp8  /dev/ttysWK00  /dev/ttysWK30<br>/dev/tty10  /dev/tty21  /dev/tty32  /dev/tty43  /dev/tty54  /dev/tty8     /dev/ttyp9  /dev/ttysWK01  /dev/ttysWK31<br>/dev/tty11  /dev/tty22  /dev/tty33  /dev/tty44  /dev/tty55  /dev/tty9     /dev/ttypa  /dev/ttysWK02  /dev/ttysWK32<br>/dev/tty12  /dev/tty23  /dev/tty34  /dev/tty45  /dev/tty56  /dev/ttymxc1  /dev/ttypb  /dev/ttysWK03  /dev/ttysWK33<br>/dev/tty13  /dev/tty24  /dev/tty35  /dev/tty46  /dev/tty57  /dev/ttyp0    /dev/ttypc  /dev/ttysWK10  /dev/ttyUSB0<br>/dev/tty14  /dev/tty25  /dev/tty36  /dev/tty47  /dev/tty58  /dev/ttyp1    /dev/ttypd  /dev/ttysWK11<br>/dev/tty15  /dev/tty26  /dev/tty37  /dev/tty48  /dev/tty59  /dev/ttyp2    /dev/ttype  /dev/ttysWK12<br>/dev/tty16  /dev/tty27  /dev/tty38  /dev/tty49  /dev/tty6   /dev/ttyp3    /dev/ttypf  /dev/ttysWK13<br>/dev/tty17  /dev/tty28  /dev/tty39  /dev/tty5   /dev/tty60  /dev/ttyp4    /dev/ttyS0  /dev/ttysWK20<br>/dev/tty18  /dev/tty29  /dev/tty4   /dev/tty50  /dev/tty61  /dev/ttyp5    /dev/ttyS1  /dev/ttysWK21<br></code></pre></td></tr></table></figure>

<p>通常，系统串口名称如 <code>/dev/ttyS0</code>, <code>/dev/ttyS1</code>（原生串口）或 <code>/dev/ttyUSB0</code>, <code>/dev/ttyUSB1</code>（USB转串口）。您需要查看这些设备哪个存在。</p>
<p>拔掉插在 ip 盒子上的顶棚灯转USB串口线，再次执行命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@imx8mp:~<span class="hljs-comment"># ls /dev/tty*</span><br>/dev/tty    /dev/tty19  /dev/tty3   /dev/tty40  /dev/tty51  /dev/tty62    /dev/ttyp6  /dev/ttyS2     /dev/ttysWK22<br>/dev/tty0   /dev/tty2   /dev/tty30  /dev/tty41  /dev/tty52  /dev/tty63    /dev/ttyp7  /dev/ttyS3     /dev/ttysWK23<br>/dev/tty1   /dev/tty20  /dev/tty31  /dev/tty42  /dev/tty53  /dev/tty7     /dev/ttyp8  /dev/ttysWK00  /dev/ttysWK30<br>/dev/tty10  /dev/tty21  /dev/tty32  /dev/tty43  /dev/tty54  /dev/tty8     /dev/ttyp9  /dev/ttysWK01  /dev/ttysWK31<br>/dev/tty11  /dev/tty22  /dev/tty33  /dev/tty44  /dev/tty55  /dev/tty9     /dev/ttypa  /dev/ttysWK02  /dev/ttysWK32<br>/dev/tty12  /dev/tty23  /dev/tty34  /dev/tty45  /dev/tty56  /dev/ttymxc1  /dev/ttypb  /dev/ttysWK03  /dev/ttysWK33<br>/dev/tty13  /dev/tty24  /dev/tty35  /dev/tty46  /dev/tty57  /dev/ttyp0    /dev/ttypc  /dev/ttysWK10<br>/dev/tty14  /dev/tty25  /dev/tty36  /dev/tty47  /dev/tty58  /dev/ttyp1    /dev/ttypd  /dev/ttysWK11<br>/dev/tty15  /dev/tty26  /dev/tty37  /dev/tty48  /dev/tty59  /dev/ttyp2    /dev/ttype  /dev/ttysWK12<br>/dev/tty16  /dev/tty27  /dev/tty38  /dev/tty49  /dev/tty6   /dev/ttyp3    /dev/ttypf  /dev/ttysWK13<br>/dev/tty17  /dev/tty28  /dev/tty39  /dev/tty5   /dev/tty60  /dev/ttyp4    /dev/ttyS0  /dev/ttysWK20<br>/dev/tty18  /dev/tty29  /dev/tty4   /dev/tty50  /dev/tty61  /dev/ttyp5    /dev/ttyS1  /dev/ttysWK21<br></code></pre></td></tr></table></figure>

<p>这个差别，这就是顶棚灯串口设备路径了：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">/dev/ttyUSB0<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 11 月 20 日 </p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/IP%E6%9C%BA%E9%A1%B6%E7%9B%92/2497303">IP机顶盒_百度百科</a></p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/381934481">(99+ 封私信 / 82 条消息) 公网ip盒子？ - 知乎</a></p>
<h2 id="Figma"><a href="#Figma" class="headerlink" title="Figma"></a>Figma</h2><blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.figma.com/files/team/1078979956408784042/recents-and-sharing?fuid=1078979949342427430">Home – Figma</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7506051295951732748">没设计也能很漂亮，非常适合独立开发：Trae + 飞个马MCP 因为团队规模比较小，没有专门的设计师，就尝试使用Trae - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://developers.figma.com/docs/rest-api/#authentication">Introduction | Developer Docs</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251118170525775.png" alt="image-20251118170525775"></p>
<figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gcode">figd_HoRi<span class="hljs-number">7</span>tW<span class="hljs-number">3</span>q<span class="hljs-number">5</span>MlBxcoxP<span class="hljs-number">5</span><span class="hljs-symbol">N3</span>UUVBERHSiAEtfXcMH<span class="hljs-number">9</span>x<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://docs.trae.cn/ide/model-context-protocol">模型上下文协议（MCP） - 文档 - TRAE CN</a></p>
<p>Node 版本过低，得重新下载新版本。</p>
<figure class="highlight vbnet"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs vbnet"><span class="hljs-symbol">D:</span>\softWare\nvm\nvm\v18.<span class="hljs-number">16.1</span>\node_cache\_npx\e05028111420be70\node_modules\sharp\<span class="hljs-keyword">lib</span>\sharp.js:<span class="hljs-number">120</span><br>  <span class="hljs-keyword">throw</span> <span class="hljs-built_in">new</span> <span class="hljs-keyword">Error</span>(help.<span class="hljs-keyword">join</span>(<span class="hljs-comment">&#x27;\n&#x27;));</span><br>        ^<br><br><span class="hljs-symbol">Error:</span> Could <span class="hljs-built_in">not</span> load the <span class="hljs-string">&quot;sharp&quot;</span> <span class="hljs-keyword">module</span> <span class="hljs-keyword">using</span> the win32-x64 runtime<br>Possible solutions:<br>- Please upgrade Node.js:<br>    Found <span class="hljs-number">16.19</span>.<span class="hljs-number">0</span><br>    Requires ^<span class="hljs-number">18.17</span>.<span class="hljs-number">0</span> || ^<span class="hljs-number">20.3</span>.<span class="hljs-number">0</span> || &gt;=<span class="hljs-number">21.0</span>.<span class="hljs-number">0</span><br>- Consult the installation documentation:<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nvm list					   <span class="hljs-comment">#查看已安装的node版本号</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nvm list available			   <span class="hljs-comment">#查看可安装的node版本</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nvm install 【版本号】			<span class="hljs-comment">#安装指定版本的node</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nvm use 【版本号】				<span class="hljs-comment">#使用指定版本的node</span><br></code></pre></td></tr></table></figure>

<p>又出问题：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs bash">D:\softWare\nvm\nvm\v18.16.1\node_cache\_npx\e05028111420be70\node_modules\sharp\lib\sharp.js:120<br>  throw new Error(help.join(<span class="hljs-string">&#x27;\n&#x27;</span>));<br>        ^<br><br>Error: Could not load the <span class="hljs-string">&quot;sharp&quot;</span> module using the win32-x64 runtime<br>Possible solutions:<br>- Ensure optional dependencies can be installed:<br>    npm install --include=optional sharp<br>- Ensure your package manager supports multi-platform installation:<br>    See https://sharp.pixelplumbing.com/install<span class="hljs-comment">#cross-platform</span><br>- Add platform-specific dependencies:<br>    npm install --os=win32 --cpu=x64 sharp<br>- Consult the installation documentation:<br>    See https://sharp.pixelplumbing.com/install<br>    at Object.&lt;anonymous&gt; (D:\softWare\nvm\nvm\v18.16.1\node_cache\_npx\e05028111420be70\node_modules\sharp\lib\sharp.js:120:9)<br>    at Module._compile (node:internal/modules/cjs/loader:1706:14)<br>    at Object..js (node:internal/modules/cjs/loader:1839:10)<br>    at Module.load (node:internal/modules/cjs/loader:1441:32)<br>    at Function._load (node:internal/modules/cjs/loader:1263:12)<br>    at TracingChannel.traceSync (node:diagnostics_channel:328:14)<br>    at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)<br>    at Module.require (node:internal/modules/cjs/loader:1463:12)<br>    at require (node:internal/modules/helpers:147:16)<br>    at Object.&lt;anonymous&gt; (D:\softWare\nvm\nvm\v18.16.1\node_cache\_npx\e05028111420be70\node_modules\sharp\lib\constructor.js:10:1)<br><br>Node.js v22.21.1<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">npm install --include=optional sharp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">npm install --os=win32 --cpu=x64 sharp<br></code></pre></td></tr></table></figure>

<p>怎么还是报错。。</p>
<h2 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h2><blockquote>
<p>2025 年 12 月 3 日</p>
</blockquote>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile"><span class="hljs-keyword">WORKDIR</span><span class="language-bash"> 工作目录，是容器内部的工作目录，还是宿主机？</span><br></code></pre></td></tr></table></figure>

<p><strong>WORKDIR 的作用范围</strong></p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile"><span class="hljs-comment"># 这个路径指的是容器内部的路径</span><br><span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span><br><span class="hljs-comment"># 相当于在容器内部执行：cd /app</span><br></code></pre></td></tr></table></figure>

<table>
<thead>
<tr>
<th align="left">指令</th>
<th align="left">作用范围</th>
<th align="left">示例</th>
<th align="left">效果</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>WORKDIR</strong></td>
<td align="left">容器内部</td>
<td align="left"><code>WORKDIR /app</code></td>
<td align="left">设置容器内工作目录</td>
</tr>
<tr>
<td align="left"><strong>-v 挂载</strong></td>
<td align="left">宿主机↔容器</td>
<td align="left"><code>-v /host:/container</code></td>
<td align="left">目录映射</td>
</tr>
<tr>
<td align="left"><strong>COPY</strong></td>
<td align="left">宿主机→容器</td>
<td align="left"><code>COPY . .</code></td>
<td align="left">文件复制</td>
</tr>
<tr>
<td align="left"><strong>-w 参数</strong></td>
<td align="left">覆盖WORKDIR</td>
<td align="left"><code>-w /newdir</code></td>
<td align="left">运行时设置工作目录</td>
</tr>
</tbody></table>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">我不明白啊，根据镜像文件构建容器，那这个容器内部的目录结构是什么样子，我完全没概念。<br></code></pre></td></tr></table></figure>

<p><strong>基础镜像的目录结构</strong></p>
<p>以 <code>python:3.9-slim</code>为例，它内部的目录结构是这样的：</p>
<figure class="highlight cal"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs cal">/                 (根目录)<br>├── bin/          (可执行文件)<br>├── etc/          (配置文件)<br>├── home/         (用户目录)<br>├── root/         (root用户目录)<br>├── tmp/          (临时文件)<br>├── usr/          (用户程序)<br>│   ├── bin/      (用户命令)<br>│   └── <span class="hljs-keyword">local</span>/    (本地安装程序)<br>├── <span class="hljs-keyword">var</span>/          (可变数据)<br>└── opt/          (可选应用软件)<br></code></pre></td></tr></table></figure>

<hr>
<figure class="highlight coq"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs coq">都说Dockerfile镜像文件第一行必须是<span class="hljs-keyword">From</span>指定根据哪个镜像构建，那到底应该根据哪个镜像构建呢，这里编码有什么名堂吗，基于不同的镜像构建又有什么区别？<br></code></pre></td></tr></table></figure>

<p>基础镜像的选择策略。</p>
<ol>
<li><strong>官方镜像 vs 非官方镜像</strong></li>
</ol>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile"><span class="hljs-comment"># ✅ 推荐：官方镜像</span><br><span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.9</span>-slim<br><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">16</span>-alpine<br><span class="hljs-keyword">FROM</span> nginx:latest<br><br><span class="hljs-comment"># ⚠️ 谨慎：非官方镜像（可能存在安全风险）</span><br><span class="hljs-keyword">FROM</span> someuser/random-image<br><span class="hljs-keyword">FROM</span> unknown-registry/app<br></code></pre></td></tr></table></figure>

<ol start="2">
<li><strong>不同标签的区别</strong></li>
</ol>
<figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs crmsh"><span class="hljs-comment"># Python镜像的不同版本</span><br>FROM python:<span class="hljs-number">3.9</span>          <span class="hljs-comment"># 完整版，包含编译工具（约900MB）</span><br>FROM python:<span class="hljs-number">3.9</span>-slim     <span class="hljs-comment"># 精简版，只含运行时（约150MB）</span><br>FROM python:<span class="hljs-number">3.9</span>-alpine  <span class="hljs-comment"># 最小版，基于Alpine（约50MB）</span><br><br><span class="hljs-comment"># Node.js镜像的不同版本  </span><br>FROM <span class="hljs-keyword">node</span><span class="hljs-title">:16</span>            <span class="hljs-comment"># 完整版</span><br>FROM <span class="hljs-keyword">node</span><span class="hljs-title">:16-slim</span>       <span class="hljs-comment"># 精简版</span><br>FROM <span class="hljs-keyword">node</span><span class="hljs-title">:16-alpine</span>     <span class="hljs-comment"># Alpine版</span><br></code></pre></td></tr></table></figure>

<p>📊 主流基础镜像对比</p>
<table>
<thead>
<tr>
<th align="left">镜像类型</th>
<th align="left">大小</th>
<th align="left">特点</th>
<th align="left">适用场景</th>
<th align="left">示例</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>完整版</strong></td>
<td align="left">300MB-1GB</td>
<td align="left">包含完整工具链</td>
<td align="left">开发环境、需要编译</td>
<td align="left"><code>python:3.9</code></td>
</tr>
<tr>
<td align="left"><strong>精简版</strong></td>
<td align="left">100-300MB</td>
<td align="left">只含运行时</td>
<td align="left">生产环境</td>
<td align="left"><code>python:3.9-slim</code></td>
</tr>
<tr>
<td align="left"><strong>Alpine版</strong></td>
<td align="left">5-100MB</td>
<td align="left">极简、安全</td>
<td align="left">微服务、资源敏感</td>
<td align="left"><code>python:3.9-alpine</code></td>
</tr>
<tr>
<td align="left"><strong>Distroless</strong></td>
<td align="left">20-50MB</td>
<td align="left">无shell、最安全</td>
<td align="left">安全要求高的生产</td>
<td align="left"><code>gcr.io/distroless/python3</code></td>
</tr>
</tbody></table>
<blockquote>
<p>2025 年 12 月 1 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7154437479955693598">Docker入门到实践（一）docker简介和安装docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及 - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 21 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7398127381263056937?searchId=20251121085310C8D01EAF2506D2388103">基于Docker、JenKins、Nginx、Harbor、Github及腾讯云服务器搭建个人博客基于Docker、Je - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 20 日</p>
</blockquote>
<p>查找并删除特定镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker images | grep <span class="hljs-string">&quot;nginx&quot;</span> | awk <span class="hljs-string">&#x27;&#123;print $3&#125;&#x27;</span> | xargs docker rmi<br></code></pre></td></tr></table></figure>

<ul>
<li><code>docker images</code>：列出所有镜像</li>
<li><code>grep &quot;nginx&quot;</code>：过滤出包含”nginx”的行</li>
<li><code>awk &#39;&#123;print $3&#125;&#39;</code>：提取第三列（镜像ID）</li>
<li><code>xargs docker rmi</code>：将镜像ID作为参数传递给<code>docker rmi</code>删除</li>
</ul>
<p>xargs命令从标准输入读取数据，并将这些数据作为参数传递给指定的命令。在上面的命令中，它用于将前一个命令（如awk、grep等）输出的结果（通常是多个ID）作为参数传递给docker命令（如rmi、stop、rm等）。</p>
<p>这样可以避免手动逐个处理，实现<strong>批量操作</strong>。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查找并删除特定镜像</span><br>docker images | grep <span class="hljs-string">&quot;nginx&quot;</span> | awk <span class="hljs-string">&#x27;&#123;print $3&#125;&#x27;</span> | xargs docker rmi<br><br><span class="hljs-comment"># 停止所有运行中的容器</span><br>docker ps -q | xargs docker stop<br><br><span class="hljs-comment"># 删除所有退出状态的容器</span><br>docker ps -a | grep <span class="hljs-string">&quot;Exited&quot;</span> | awk <span class="hljs-string">&#x27;&#123;print $1&#125;&#x27;</span> | xargs docker <span class="hljs-built_in">rm</span><br><br><span class="hljs-comment"># 查看容器占用的端口</span><br>docker ps --format <span class="hljs-string">&quot;table &#123;&#123;.Names&#125;&#125;\t&#123;&#123;.Ports&#125;&#125;&quot;</span> | grep <span class="hljs-string">&quot;80&quot;</span><br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2545213?policyId=1004">Docker常用命令大全：一篇文章让你掌握所有技巧-腾讯云开发者社区-腾讯云</a></p>
<p>管道操作，批量操作，条件过滤与格式化，设置别名和快捷命令，脚本自动化管理，常见问题排查命令……</p>
<p>组合命令和高效技巧，等今后用到了再过头来总结吧。</p>
<blockquote>
<p>2025 年 11 月 19 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7029602998141747236?searchId=202511190949011974CFF3A66ACA3E822C">Linux K8S（Kubernetes）常用命令一个完备的分布式系统支撑平台，具有完备的集群管理能力，多扩多层次的安全 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7440477979752808500?searchId=202511190949011974CFF3A66ACA3E822C">开发运维们，肯巴尔斯（K8s）驾到。对于K8s这种涉及领域广、知识面杂的技术，一上来就想抠细节、要吃透，多少有点盲目。本 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/6952331691524358174?searchId=202511190949011974CFF3A66ACA3E822C">最详细的 K8S 学习笔记总结（2021最新版）虽然 Docker 已经很强大了，但是在实际使用上还是有诸多不便，比如集 - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2583695">有哪些常见的Docker容器操作命令？掌握这些Docker命令，让容器管理事半功倍-腾讯云开发者社区-腾讯云</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7154441046083141645?searchId=20251118151303668E645CEEFB792AE825">Docker入门到实践（三）Dockerfile解析与镜像制作在上一篇文章中已经介绍了 docker 常用命令的讲解, - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/6952331691524358174?searchId=202511181515347A17D74C246050E6BF91">最详细的 K8S 学习笔记总结（2021最新版）虽然 Docker 已经很强大了，但是在实际使用上还是有诸多不便，比如集 - 掘金</a></p>
<p>下午重温了监测系统项目架构，目前需要学习的主要是 Docker，串口屏。</p>
<p>Docker命令可以按功能分为五大类：</p>
<ol>
<li><strong>镜像管理命令</strong>：pull、push、build、images、rmi等</li>
<li><strong>容器生命周期命令</strong>：run、start、stop、rm、exec等</li>
<li><strong>网络管理命令</strong>：network create、network ls等</li>
<li><strong>存储管理****命令</strong>：volume create、volume ls等</li>
<li><strong>系统信息命令</strong>：info、stats、system等</li>
</ol>
<h2 id="远程调试"><a href="#远程调试" class="headerlink" title="远程调试"></a>远程调试</h2><blockquote>
<p>2025 年 11 月 24 日</p>
</blockquote>
<p>周五调IO卡，自己鼓捣了一下午都没能ping通，晚上七点半才蹭车回到家，周六还得去一趟协助调试顶棚灯。</p>
<p>周六，中午十二点半起身出发，一点钟开始调试，他妈的一直到晚八点钟才作罢，调试的结果还不在预期，浪费我宝贵的周末时间。</p>
<p>周日休息。</p>
<p>周一。</p>
<blockquote>
<p>2025 年 11 月 21 日</p>
</blockquote>
<p>周三，费显调试结束，晚六点后离开前才确认声光报警有问题。</p>
<p>周四，调IO调不了，反复确认IO卡不是串口就是网口，就是网口，掰扯了三天总算罢休，中午不调了，得等之后再调试IO卡和顶棚灯。</p>
<p>周五，不清楚今中午还能调什么。</p>
<blockquote>
<p>2025 年 11 月 20 日</p>
</blockquote>
<p>中午回去得取个邮政快递，接下来的安排基本跟昨天一样，希望今天中午的调试工作能顺利完成吧，就能空余出时间来由自己折腾。</p>
<blockquote>
<p>2025 年 11 月 19 日</p>
</blockquote>
<p>早上十点钟下楼，回家里躺一会儿，煮面吃，十二点钟打个车子去车道。</p>
<figure class="highlight tap"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs tap">IO读<br>发送到设备：01<span class="hljs-number"> 02 </span>00<span class="hljs-number"> 00 </span>00<span class="hljs-number"> 08 </span>79 CC<br>01<span class="hljs-number"> 02 </span>00 C8<span class="hljs-number"> 00 </span>08 F8<span class="hljs-number"> 32 </span><br>设备回复：01<span class="hljs-number"> 02 </span>01<span class="hljs-number"> 02 </span>20 49，第四个字节（02）是返回的设备IO状态<br>IO写<br>发送到设备：01<span class="hljs-number"> 05 </span>00<span class="hljs-number"> 00 </span>FF<span class="hljs-number"> 00 </span>8C 3A，第四个字节（00）表示第一位，第N位=N-1，第五（FF）表示高电平，（00）表示低电平。<br>01<span class="hljs-number"> 05 </span>00<span class="hljs-number"> 00 </span>FF<span class="hljs-number"> 00 </span>8C 3A<br>01<span class="hljs-number"> 05 </span>00<span class="hljs-number"> 64 </span>00<span class="hljs-number"> 00 </span>8C 15<br></code></pre></td></tr></table></figure>

<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs aspectj"><span class="hljs-meta">@matty</span> 现场恢复后测过了，费显正常，但声光报警不工作，之后他们得检查下<br></code></pre></td></tr></table></figure>

<p>下午六点多钟蹭车回单位，坐电梯直接上一层大厅回家。</p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p>自上周三开始，周五、周六、周日、周一各跑了一趟去车道协助远程调试云收费系统，连续几天都没睡过安稳的午觉。</p>
<p>周三跟着维修人员，中午用串口线调试费用显示器，晚六点前回到单位，他们还发了个动态库给我。</p>
<p>周四在工位坐了一天，下午又接到通知让周五跟他们一块儿去车道现场，周五从早去到现场一直到晚六点半才回单位，直接回家了。</p>
<p>周五就没有调试任务，得周末才开始调。</p>
<p>周六，早十点钟打车到车道现场，一直到下午快六点钟才调试结束，接内网看ETC工控机ip搞出了一堆破事，调试效率太低。</p>
<p>周日，中午一点钟临时协商好去车道现场，把刚买回的键盘取到手后就能配合调试，结果一搞就到了晚八点钟才回，车牌识别还没测完。</p>
<p>周一，早十一点钟打个车子现场，半小时后封车道协调完毕，中午十二点去餐厅吃了顿饱饭，两点前结束车牌识别调试，调试费额显示器的时候因为串口线有问题，从两点半折腾到下午四点半才确定是芯片老旧的问题，买根新线再试应该没问题。</p>
<p>周二，估计不去了，妈的昨晚又给我发消息问今天能不能测，新线上午到不了就周三调试，我估摸着肯定到不了了，京东快递撑死了一天内给送到，得今天晚些甚至明天早上才能取到了。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_36123300/article/details/151591569">亲测有效！WIN10系统PL2303 USB转串口驱动兼容问题解决指南-CSDN博客</a></p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs lua">接下来要调<span class="hljs-built_in">io</span>，需要一块铁板压地感，有时垃圾斗就可以，最好一块大一点的铁，比如栏杆机的门，或机箱的侧面铁板之类的。<br></code></pre></td></tr></table></figure>

<h2 id="单片机"><a href="#单片机" class="headerlink" title="单片机"></a>单片机</h2><blockquote>
<p>2025 年 11 月 24 日</p>
</blockquote>
<p>什么是单片机？</p>
<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica">单片机（<span class="hljs-variable">Single</span><span class="hljs-operator">-</span><span class="hljs-variable">Chip</span> <span class="hljs-variable">Microcomputer</span>）是一种集成电路芯片，是采用超大规模集成电路技术把具有数据处理能力的中央处理器<span class="hljs-variable">CPU</span>、随机存储器<span class="hljs-variable">RAM</span>、只读存储器<span class="hljs-variable">ROM</span>、多种<span class="hljs-built_in">I</span><span class="hljs-operator">/</span><span class="hljs-built_in">O</span>口和中断系统、定时器<span class="hljs-operator">/</span>计数器等功能（可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、<span class="hljs-variable">A</span><span class="hljs-operator">/</span><span class="hljs-built_in">D</span>转换器等电路）集成到一块硅片上构成的一个小而完善的微型计算机系统，在工业控制领域广泛应用。从上世纪<span class="hljs-number">80</span>年代，由当时的<span class="hljs-number">4</span>位、<span class="hljs-number">8</span>位单片机，发展到现在的<span class="hljs-number">300</span><span class="hljs-variable">M</span>的高速单片机。<br></code></pre></td></tr></table></figure>

<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica">单片机又称单片微控制器，它不是完成某一个逻辑功能的芯片，而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机，和计算机相比，单片机只缺少了<span class="hljs-built_in">I</span><span class="hljs-operator">/</span><span class="hljs-built_in">O</span>设备。概括的讲：一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时，学习使用单片机是了解计算机原理与结构的最佳选择。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1792226162809093918&wfr=spider&for=pc">什么是单片机？它由哪几部分组成？组成、特点与发展趋势解读</a></p>
<p>单片机的应用领域。</p>
<p>由于单片机具有体积小、功耗低、可靠性高、开发方便等特点，因此被广泛应用于各个领域：</p>
<p><strong>1. 智能仪表</strong>：如电能表、水表、气表等，用于实现数据的采集、处理和显示。</p>
<p><strong>2. 实时测控</strong>：如温度控制、压力控制等工业测控系统。</p>
<p><strong>3. 通讯设备</strong>：如手机、无线对讲机等通讯设备中，用于实现信号的处理和传输。</p>
<p><strong>4. 导航系统</strong>：如GPS导航系统，用于实现定位和导航功能。</p>
<p><strong>5. 家用电器</strong>：如空调、冰箱、洗衣机等家用电器中，用于实现智能化控制和节能管理。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">串口屏开发需要用到 USART HMI 编辑器，那么单片机开发呢，常用的编辑器有哪些？<br></code></pre></td></tr></table></figure>

<p>单片机开发的核心是<strong>集成开发环境（IDE）</strong>，它把代码编辑、编译、调试、烧录等功能集成在一起，下面这个表格汇总了不同单片机常用的主流IDE，方便你快速了解。</p>
<table>
<thead>
<tr>
<th align="left">单片机系列/架构</th>
<th align="left">主流IDE选择</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>STM32 (ARM Cortex-M)</strong></td>
<td align="left"><strong>STM32CubeIDE</strong>, <strong>Keil MDK-ARM</strong>, <strong>IAR Embedded Workbench</strong></td>
</tr>
<tr>
<td align="left"><strong>ESP32/ESP8266</strong></td>
<td align="left"><strong>ESP-IDF</strong>, <strong>Arduino IDE</strong>, <strong>PlatformIO</strong> (支持多种框架)</td>
</tr>
<tr>
<td align="left"><strong>51单片机</strong></td>
<td align="left"><strong>Keil C51</strong></td>
</tr>
<tr>
<td align="left"><strong>PIC单片机</strong></td>
<td align="left"><strong>MPLAB X IDE</strong></td>
</tr>
<tr>
<td align="left"><strong>AVR单片机</strong></td>
<td align="left"><strong>Microchip Studio (原Atmel Studio)</strong>, <strong>Arduino IDE</strong></td>
</tr>
</tbody></table>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/86149">嵌入式开发_百度百科</a></p>
<p>一个典型的嵌入式系统通常包括硬件和软件两部分：</p>
<ul>
<li><strong>硬件</strong>：以<strong>嵌入式微处理器</strong>（如ARM Cortex-M系列芯片）为核心，配以存储器、输入/输出设备及电源管理等。</li>
<li><strong>软件</strong>：包括可选的<strong>嵌入式操作系统</strong>（如FreeRTOS、Linux）和<strong>专用的应用程序</strong>，这些软件通常被固化在存储芯片中。</li>
</ul>
<h2 id="串口屏"><a href="#串口屏" class="headerlink" title="串口屏"></a>串口屏</h2><blockquote>
<p>2025 年 12 月 4 日</p>
</blockquote>
<p>基本通信协议格式。</p>
<ol>
<li><strong>指令格式</strong></li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs c"># 基本格式：指令 + 结束符<br><span class="hljs-string">&quot;指令内容\xFF\xFF\xFF&quot;</span><br><br># 示例：<br><span class="hljs-string">&quot;page 1\xFF\xFF\xFF&quot;</span>                    # 页面切换<br><span class="hljs-string">&quot;t0.txt=\&quot;Hello World\&quot;\xFF\xFF\xFF&quot;</span>    # 设置文本<br><span class="hljs-string">&quot;j0.val=50\xFF\xFF\xFF&quot;</span>                 # 设置进度条值<br></code></pre></td></tr></table></figure>

<ol start="2">
<li><strong>通信方向</strong></li>
</ol>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs">Python程序 → 串口屏：发送控制指令<br>串口屏 → Python程序：发送触摸事件、传感器数据等<br></code></pre></td></tr></table></figure>

<p>📋 完整协议规范</p>
<p>下行协议（Python → 串口屏）</p>
<p>页面控制指令</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs c"># 页面跳转<br><span class="hljs-string">&quot;page 0\xFF\xFF\xFF&quot;</span>                    # 跳转到页面<span class="hljs-number">0</span><br><span class="hljs-string">&quot;page main\xFF\xFF\xFF&quot;</span>                 # 跳转到名为main的页面<br><br># 页面刷新<br><span class="hljs-string">&quot;ref 0\xFF\xFF\xFF&quot;</span>                     # 刷新页面<span class="hljs-number">0</span><br></code></pre></td></tr></table></figure>

<p>控件操作指令</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs c"># 文本控件<br><span class="hljs-string">&quot;t0.txt=\&quot;温度:25℃\&quot;\xFF\xFF\xFF&quot;</span>      # 设置文本内容<br><span class="hljs-string">&quot;t1.txt=\&quot;湿度:60%\&quot;\xFF\xFF\xFF&quot;</span><br><br># 进度条/仪表控件  <br><span class="hljs-string">&quot;j0.val=75\xFF\xFF\xFF&quot;</span>                 # 设置进度条值(<span class="hljs-number">0</span><span class="hljs-number">-100</span>)<br><span class="hljs-string">&quot;z0.val=50\xFF\xFF\xFF&quot;</span>                 # 设置仪表值<br><br># 按钮控件<br><span class="hljs-string">&quot;b0.txt=\&quot;确定\&quot;\xFF\xFF\xFF&quot;</span>           # 设置按钮文本<br><span class="hljs-string">&quot;b0.bco=63488\xFF\xFF\xFF&quot;</span>              # 设置按钮背景色(RGB565)<br><br># 显示/隐藏控件<br><span class="hljs-string">&quot;vis t0,1\xFF\xFF\xFF&quot;</span>                  # 显示文本控件t0<br><span class="hljs-string">&quot;vis b1,0\xFF\xFF\xFF&quot;</span>                  # 隐藏按钮b1<br></code></pre></td></tr></table></figure>

<p>系统指令</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs c"># 背光控制<br><span class="hljs-string">&quot;dim=100\xFF\xFF\xFF&quot;</span>                   # 背光亮度<span class="hljs-number">100</span>%<br><span class="hljs-string">&quot;sleep=0\xFF\xFF\xFF&quot;</span>                   # 禁止休眠<br><br># 声音提示<br><span class="hljs-string">&quot;beep\xFF\xFF\xFF&quot;</span>                      # 蜂鸣器响一声<br><br># 系统重启<br><span class="hljs-string">&quot;restart\xFF\xFF\xFF&quot;</span>                   # 重启串口屏<br></code></pre></td></tr></table></figure>

<p>上行协议（串口屏 → Python）</p>
<p>触摸事件格式</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs c"># 触摸按下事件：<span class="hljs-number">65</span> PP CC <span class="hljs-number">01</span> FF FF FF<br># 触摸释放事件：<span class="hljs-number">65</span> PP CC <span class="hljs-number">00</span> FF FF FF<br><br># 其中：<br># <span class="hljs-number">65</span>: 固定头(触摸事件)<br># PP: 页面ID  <br># CC: 控件ID<br># <span class="hljs-number">01</span>/<span class="hljs-number">00</span>: 状态(<span class="hljs-number">01</span>=按下, <span class="hljs-number">00</span>=释放)<br></code></pre></td></tr></table></figure>

<p>数据上报格式</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs c"># 控件值变化上报<br><span class="hljs-string">&quot;t0.txt=\&quot;新值\&quot;\xFF\xFF\xFF&quot;</span>           # 文本内容变化<br><span class="hljs-string">&quot;j0.val=50\xFF\xFF\xFF&quot;</span>                 # 进度条值变化<br><span class="hljs-string">&quot;n0.val=123\xFF\xFF\xFF&quot;</span>                # 数值变化<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 12 月 1 日</p>
</blockquote>
<p>怪不得本机 Python 监听程序失效，在编辑界面的按钮按下事件里勾选<strong>发送键值</strong>选项，模拟器在<strong>用户MCU输入</strong>选项下的串口配置中启动。</p>
<p>这样在模拟器点击按钮后就能接收到返回的数据，如图所示：</p>
<p><img src="http://blog.memory-life.xyz/image-20251201091736358.png" alt="image-20251201091736358"></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">advanced_button_listener</span>():<br>    <span class="hljs-string">&quot;&quot;&quot;监听按钮点击事件的完整程序&quot;&quot;&quot;</span><br>    <span class="hljs-keyword">try</span>:<br>        <span class="hljs-comment"># 连接COM4（模拟器连接COM3）</span><br>        ser = serial.Serial(<span class="hljs-string">&#x27;COM4&#x27;</span>, <span class="hljs-number">115200</span>, timeout=<span class="hljs-number">1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🎯 按钮监听程序已启动&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;📡 监听COM4，等待COM3的模拟器信号&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;请在模拟器中点击配置了&#x27;触摸发送&#x27;的按钮&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;按Ctrl+C停止监听\n&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;-&quot;</span> * <span class="hljs-number">60</span>)<br><br>        receive_count = <span class="hljs-number">0</span><br><br>        <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>            <span class="hljs-comment"># 检查是否有数据</span><br>            <span class="hljs-keyword">if</span> ser.in_waiting &gt; <span class="hljs-number">0</span>:<br>                data = ser.read(ser.in_waiting)<br>                receive_count += <span class="hljs-number">1</span><br>                current_time = datetime.now().strftime(<span class="hljs-string">&quot;%H:%M:%S&quot;</span>)<br><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\n🕒 [<span class="hljs-subst">&#123;current_time&#125;</span>] 第<span class="hljs-subst">&#123;receive_count&#125;</span>次收到数据:&quot;</span>)<br><br>                <span class="hljs-comment"># 显示十六进制</span><br>                hex_data = <span class="hljs-string">&#x27; &#x27;</span>.join([<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;b:02X&#125;</span>&#x27;</span> <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> data])<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🔢 原始数据: <span class="hljs-subst">&#123;hex_data&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 尝试解析为文本</span><br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-comment"># 尝试UTF-8解码</span><br>                    text_utf8 = data.decode(<span class="hljs-string">&#x27;utf-8&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br>                    <span class="hljs-comment"># 尝试GB2312解码（中文常用）</span><br>                    text_gb = data.decode(<span class="hljs-string">&#x27;gb2312&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br><br>                    <span class="hljs-comment"># 显示可读部分</span><br>                    clean_utf8 = <span class="hljs-string">&#x27;&#x27;</span>.join(c <span class="hljs-keyword">if</span> <span class="hljs-number">32</span> &lt;= <span class="hljs-built_in">ord</span>(c) &lt;= <span class="hljs-number">126</span> <span class="hljs-keyword">else</span> <span class="hljs-string">f&#x27;[<span class="hljs-subst">&#123;<span class="hljs-built_in">ord</span>(c):02X&#125;</span>]&#x27;</span> <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> text_utf8)<br>                    clean_gb = <span class="hljs-string">&#x27;&#x27;</span>.join(c <span class="hljs-keyword">if</span> <span class="hljs-number">32</span> &lt;= <span class="hljs-built_in">ord</span>(c) &lt;= <span class="hljs-number">126</span> <span class="hljs-keyword">else</span> <span class="hljs-string">f&#x27;[<span class="hljs-subst">&#123;<span class="hljs-built_in">ord</span>(c):02X&#125;</span>]&#x27;</span> <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> text_gb)<br><br>                    <span class="hljs-keyword">if</span> clean_utf8.strip():<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📝 UTF-8文本: <span class="hljs-subst">&#123;clean_utf8&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">if</span> clean_gb.strip() <span class="hljs-keyword">and</span> clean_gb != clean_utf8:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📝 GB2312文本: <span class="hljs-subst">&#123;clean_gb&#125;</span>&quot;</span>)<br>                <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 解码错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 解析标准触摸事件 (65 PP PP CC CC SS FF FF FF)</span><br>                <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(data) &gt;= <span class="hljs-number">6</span> <span class="hljs-keyword">and</span> data[<span class="hljs-number">0</span>] == <span class="hljs-number">0x65</span>:<br>                    page_id = (data[<span class="hljs-number">1</span>] &lt;&lt; <span class="hljs-number">8</span>) | data[<span class="hljs-number">2</span>]<br>                    control_id = (data[<span class="hljs-number">3</span>] &lt;&lt; <span class="hljs-number">8</span>) | data[<span class="hljs-number">4</span>]<br>                    state = data[<span class="hljs-number">5</span>]<br><br>                    <span class="hljs-keyword">if</span> state == <span class="hljs-number">0x01</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🟢 按钮按下! 页面<span class="hljs-subst">&#123;page_id&#125;</span> 控件<span class="hljs-subst">&#123;control_id&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">elif</span> state == <span class="hljs-number">0x00</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🔴 按钮释放! 页面<span class="hljs-subst">&#123;page_id&#125;</span> 控件<span class="hljs-subst">&#123;control_id&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">else</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❓ 未知状态: <span class="hljs-subst">&#123;state:02X&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 检查是否包含常见指令</span><br>                <span class="hljs-keyword">if</span> <span class="hljs-string">b&#x27;button&#x27;</span> <span class="hljs-keyword">in</span> data.lower() <span class="hljs-keyword">or</span> <span class="hljs-string">b&#x27;click&#x27;</span> <span class="hljs-keyword">in</span> data.lower():<br>                    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🎯 检测到按钮相关指令!&quot;</span>)<br><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;-&quot;</span> * <span class="hljs-number">50</span>)<br><br>            time.sleep(<span class="hljs-number">0.05</span>)  <span class="hljs-comment"># 更快的响应</span><br><br>    <span class="hljs-keyword">except</span> KeyboardInterrupt:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\n🛑 监听结束，共收到 <span class="hljs-subst">&#123;receive_count&#125;</span> 次数据&quot;</span>)<br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>    <span class="hljs-keyword">finally</span>:<br>        <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;ser&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">locals</span>() <span class="hljs-keyword">and</span> ser.is_open:<br>            ser.close()<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🔒 串口已关闭&quot;</span>)<br></code></pre></td></tr></table></figure>

<figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs inform7">🕒 <span class="hljs-comment">[09:13:24]</span> 第3次收到数据:<br>🔢 原始数据: 65 00 07 01 FF FF FF<br>📝 UTF-8文本: e<span class="hljs-comment">[00]</span><span class="hljs-comment">[07]</span><span class="hljs-comment">[01]</span><br>❓ 未知状态: FF<br></code></pre></td></tr></table></figure>

<p>还得优化下 Python 对串口发来指令的分析。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash">Traceback (most recent call last):<br>  File <span class="hljs-string">&quot;D:\dev\Pycharm\plugins\python-ce\helpers\pydev\_pydevd_bundle\pydevd_pep_669_tracing.py&quot;</span>, line 238, <span class="hljs-keyword">in</span> py_start_callback<br>    <span class="hljs-keyword">if</span> not is_thread_alive(thread):<br>           ~~~~~~~~~~~~~~~^^^^^^^^<br>  File <span class="hljs-string">&quot;D:\dev\Pycharm\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_is_thread_alive.py&quot;</span>, line 18, <span class="hljs-keyword">in</span> is_thread_alive<br>    <span class="hljs-built_in">return</span> t.isAlive()<br>           ^^^^^^^^^<br>AttributeError: <span class="hljs-string">&#x27;ReaderThread&#x27;</span> object has no attribute <span class="hljs-string">&#x27;isAlive&#x27;</span>. Did you mean: <span class="hljs-string">&#x27;is_alive&#x27;</span>?<br>Traceback (most recent call last):<br>  File <span class="hljs-string">&quot;D:\dev\Pycharm\plugins\python-ce\helpers\pydev\_pydevd_bundle\pydevd_pep_669_tracing.py&quot;</span>, line 238, <span class="hljs-keyword">in</span> <br></code></pre></td></tr></table></figure>

<p>PyCharm 调试器内部代码使用了旧的线程方法名 isAlive()，但新版本Python中线程对象使用 is_alive()。</p>
<p>解决方案：以普通模式运行，不要使用调试模式，直接点击运行按钮。</p>
<p>妈的。</p>
<p>完整的触摸事件监听程序如下：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime<br><br><br><span class="hljs-comment"># 触摸事件解析程序</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">parse_touch_data</span>(<span class="hljs-params">data</span>):<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;接收到的数据：&quot;</span> + <span class="hljs-built_in">str</span>(data))<br><br>    <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(data) &gt;= <span class="hljs-number">7</span> <span class="hljs-keyword">and</span> data[<span class="hljs-number">0</span>] == <span class="hljs-number">0x65</span> <span class="hljs-keyword">and</span> data[-<span class="hljs-number">3</span>:] == <span class="hljs-string">b&#x27;\xFF\xFF\xFF&#x27;</span>:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;数据格式正确，开始解析...&quot;</span>)<br>        page_id = data[<span class="hljs-number">1</span>]  <span class="hljs-comment"># 页面ID</span><br>        control_id = data[<span class="hljs-number">2</span>]  <span class="hljs-comment"># 控件ID</span><br>        state = data[<span class="hljs-number">3</span>]  <span class="hljs-comment"># 状态：01=按下，00=释放/弹起</span><br><br>        <span class="hljs-keyword">return</span> &#123;<br>            <span class="hljs-string">&quot;page&quot;</span>: page_id,<br>            <span class="hljs-string">&quot;control&quot;</span>: control_id,<br>            <span class="hljs-string">&quot;state&quot;</span>: <span class="hljs-string">&quot;按下&quot;</span> <span class="hljs-keyword">if</span> state == <span class="hljs-number">0x01</span> <span class="hljs-keyword">else</span> <span class="hljs-string">&quot;弹起&quot;</span><br>        &#125;<br>    <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br><br><span class="hljs-comment"># 触摸事件监听程序</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">display_touch_listener</span>():<br>    <span class="hljs-string">&quot;&quot;&quot;按照图片格式显示触摸事件&quot;&quot;&quot;</span><br>    <span class="hljs-keyword">try</span>:<br>        ser = serial.Serial(<span class="hljs-string">&#x27;COM4&#x27;</span>, <span class="hljs-number">115200</span>, timeout=<span class="hljs-number">1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;触摸事件监听程序已启动&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;监听COM4端口，等待触摸事件...&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;=&quot;</span> * <span class="hljs-number">50</span>)<br><br>        <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>            <span class="hljs-keyword">if</span> ser.in_waiting &gt; <span class="hljs-number">0</span>:<br>                <span class="hljs-comment"># 检查是否有数据</span><br>                data = ser.read(ser.in_waiting)<br>                current_time = datetime.now().strftime(<span class="hljs-string">&quot;%H:%M:%S&quot;</span>)<br>                <span class="hljs-comment"># 解析触摸事件</span><br>                touch_info = parse_touch_data(data)<br>                <span class="hljs-comment"># 显示原始数据（十六进制格式）</span><br>                hex_data = <span class="hljs-string">&#x27; &#x27;</span>.join([<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;b:02X&#125;</span>&#x27;</span> <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> data])<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;[<span class="hljs-subst">&#123;current_time&#125;</span>] 收到数据: <span class="hljs-subst">&#123;hex_data&#125;</span>&quot;</span>)<br>                <span class="hljs-comment"># 显示解析结果</span><br>                <span class="hljs-keyword">if</span> touch_info:<br>                    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;数据含义: 页面:<span class="hljs-subst">&#123;touch_info[<span class="hljs-string">&#x27;page&#x27;</span>]&#125;</span> 控件:<span class="hljs-subst">&#123;touch_info[<span class="hljs-string">&#x27;control&#x27;</span>]&#125;</span> <span class="hljs-subst">&#123;touch_info[<span class="hljs-string">&#x27;state&#x27;</span>]&#125;</span>&quot;</span>)<br>                <span class="hljs-keyword">else</span>:<br>                    <span class="hljs-comment"># 如果不是标准触摸事件，尝试显示文本内容</span><br>                    <span class="hljs-keyword">try</span>:<br>                        text = data.decode(<span class="hljs-string">&#x27;utf-8&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>).strip()<br>                        <span class="hljs-keyword">if</span> text:<br>                            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;文本内容: <span class="hljs-subst">&#123;text&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">except</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;无法解析数据格式&quot;</span>)<br><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;-&quot;</span> * <span class="hljs-number">50</span>)<br><br>            time.sleep(<span class="hljs-number">0.05</span>)<br><br>    <span class="hljs-keyword">except</span> KeyboardInterrupt:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;\n监听结束&quot;</span>)<br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>    <span class="hljs-keyword">finally</span>:<br>        <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;ser&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">locals</span>() <span class="hljs-keyword">and</span> ser.is_open:<br>            ser.close()<br><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    <span class="hljs-comment"># 运行监听程序</span><br>    display_touch_listener()<br></code></pre></td></tr></table></figure>

<p>触摸监听后的反馈信息如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash">--------------------------------------------------<br>接收到的数据：b<span class="hljs-string">&#x27;e\x03\x07\x00\xff\xff\xff&#x27;</span><br>数据格式正确，开始解析...<br>[10:15:31] 收到数据: 65 03 07 00 FF FF FF<br>数据含义: 页面:3 控件:7 弹起<br>--------------------------------------------------<br></code></pre></td></tr></table></figure>

<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">我这样刷新该页面后，返回上一页竟然把lastpage设置成当前页面了吗，原因是刷新页面后确实执行了页面离开事件，应该怎么优化一下，刷新后不影响返回到上一页？<br></code></pre></td></tr></table></figure>

<p>很简单，在需要刷新的页面的页面离开事件中，不需要加以下代码即可：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">lastpage=dp<br></code></pre></td></tr></table></figure>

<p>以上是最简单粗暴的解决方法，还有比较优雅的解决方法，首先在 Program.s 全局文件中定义刷新标记。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">int</span> isRefreshing = <span class="hljs-number">0</span>     <span class="hljs-comment">// 刷新标志</span><br></code></pre></td></tr></table></figure>

<p>刷新按钮控件编码如下。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs c">isRefreshing=<span class="hljs-number">1</span>      <span class="hljs-comment">// 设置刷新标志</span><br>page dp              <span class="hljs-comment">// 刷新当前页面</span><br>isRefreshing=<span class="hljs-number">0</span>      <span class="hljs-comment">// 清除刷新标志</span><br></code></pre></td></tr></table></figure>

<p>该页面的页面离开事件这样写：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">// 页面离开事件</span><br><span class="hljs-keyword">if</span>(isRefreshing==<span class="hljs-number">0</span>)<br>&#123;<br>  lastpage=dp<br>&#125;<br></code></pre></td></tr></table></figure>

<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">使用Python能监听串口屏发来的触发事件信号，执行Python程序也能主动发送信号到串口屏，比如修改某个文本框的内容，那Python程序如何能在监听的过程中也能主动发送信号呢，怎么编码，反正两个Python程序不能监听同一个串口。<br></code></pre></td></tr></table></figure>

<p>同一个串口不能同时被两个Python程序监听。解决方案是使用<strong>单程序多线程</strong>或<strong>异步编程</strong>来实现同时监听和发送。以下是几种实现方式。</p>
<p>异步实现。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial<br><span class="hljs-keyword">import</span> asyncio<br><span class="hljs-keyword">import</span> threading<br><span class="hljs-keyword">import</span> time<br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">AsyncHMICommunicator</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, port=<span class="hljs-string">&#x27;COM4&#x27;</span>, baudrate=<span class="hljs-number">115200</span></span>):<br>        self.port = port<br>        self.baudrate = baudrate<br>        self.ser = <span class="hljs-literal">None</span><br>        self.running = <span class="hljs-literal">False</span><br>        <br>    <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">start</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;异步启动&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">try</span>:<br>            self.ser = serial.Serial(self.port, self.baudrate, timeout=<span class="hljs-number">0.1</span>)<br>            self.running = <span class="hljs-literal">True</span><br>            <br>            <span class="hljs-comment"># 启动监听任务</span><br>            asyncio.create_task(self._listener())<br>            <br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ 异步HMI通信器已启动&quot;</span>)<br>            <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span><br>            <br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 启动失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br>    <br>    <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">_listener</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;异步监听&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">while</span> self.running:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-keyword">if</span> self.ser.in_waiting &gt; <span class="hljs-number">0</span>:<br>                    data = self.ser.read(self.ser.in_waiting)<br>                    <span class="hljs-keyword">await</span> self._process_data(data)<br>                <span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">0.01</span>)<br>            <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;监听错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>                <span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">0.1</span>)<br>    <br>    <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">send_command</span>(<span class="hljs-params">self, command</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;异步发送指令&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.running:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;❌ 通信器未启动&quot;</span>)<br>            <span class="hljs-keyword">return</span><br>            <br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(command, <span class="hljs-built_in">str</span>):<br>                <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> command.endswith(<span class="hljs-string">&#x27;\xFF\xFF\xFF&#x27;</span>):<br>                    command += <span class="hljs-string">&#x27;\xFF\xFF\xFF&#x27;</span><br>                command = command.encode(<span class="hljs-string">&#x27;gb2312&#x27;</span>)<br>            <br>            self.ser.write(command)<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ 指令已发送: <span class="hljs-subst">&#123;command&#125;</span>&quot;</span>)<br>            <br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 发送失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>    <br>    <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">_process_data</span>(<span class="hljs-params">self, data</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;异步处理数据&quot;&quot;&quot;</span><br>        hex_data = <span class="hljs-string">&#x27; &#x27;</span>.join([<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;b:02X&#125;</span>&#x27;</span> <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> data])<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📥 收到数据: <span class="hljs-subst">&#123;hex_data&#125;</span>&quot;</span>)<br><br><span class="hljs-comment"># 异步使用示例</span><br><span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">async_main</span>():<br>    hmi = AsyncHMICommunicator(port=<span class="hljs-string">&#x27;COM4&#x27;</span>, baudrate=<span class="hljs-number">115200</span>)<br>    <br>    <span class="hljs-keyword">if</span> <span class="hljs-keyword">await</span> hmi.start():<br>        <span class="hljs-comment"># 发送初始指令</span><br>        <span class="hljs-keyword">await</span> hmi.send_command(<span class="hljs-string">&#x27;t0.txt=&quot;异步通信测试&quot;&#x27;</span>)<br>        <br>        <span class="hljs-comment"># 定时发送任务</span><br>        <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">periodic_sender</span>():<br>            counter = <span class="hljs-number">0</span><br>            <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>                <span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">3</span>)<br>                counter += <span class="hljs-number">1</span><br>                <span class="hljs-keyword">await</span> hmi.send_command(<span class="hljs-string">f&#x27;t1.txt=&quot;计数: <span class="hljs-subst">&#123;counter&#125;</span>&quot;&#x27;</span>)<br>        <br>        <span class="hljs-comment"># 启动定时发送</span><br>        asyncio.create_task(periodic_sender())<br>        <br>        <span class="hljs-comment"># 保持运行</span><br>        <span class="hljs-keyword">await</span> asyncio.Future()  <span class="hljs-comment"># 永久运行</span><br><br><span class="hljs-comment"># 运行异步程序</span><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    asyncio.run(async_main())<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">Traceback (most recent call last):<br>  File <span class="hljs-string">&quot;D:\Project\python\python通讯\python测试\asyncio.py&quot;</span>, line 88, <span class="hljs-keyword">in</span> &lt;module&gt;<br>    asyncio.run(async_main())<br>    ^^^^^^^^^^^<br>AttributeError: module <span class="hljs-string">&#x27;asyncio&#x27;</span> has no attribute <span class="hljs-string">&#x27;run&#x27;</span> (consider renaming <span class="hljs-string">&#x27;D:\Project\python\python通讯\python测试\asyncio.py&#x27;</span> since it has the same name as the standard library module named <span class="hljs-string">&#x27;asyncio&#x27;</span> and prevents importing that standard library module)<br></code></pre></td></tr></table></figure>

<p>文件命名与标准库<code>asyncio</code>模块冲突了，<strong>请 Python 文件重命名</strong>，不能使用<code>asyncio.py</code>这个文件名。</p>
<figure class="highlight vhdl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs vhdl">✅ 异步HMI通信器已启动<br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">15</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br>❌ 发送失败: <span class="hljs-symbol">&#x27;gb2312</span>&#x27; codec can<span class="hljs-symbol">&#x27;t</span> encode <span class="hljs-built_in">character</span> &#x27;\xff&#x27; <span class="hljs-keyword">in</span> position <span class="hljs-number">14</span>: illegal multibyte <span class="hljs-keyword">sequence</span><br></code></pre></td></tr></table></figure>

<p>实现不了真正意义上的异步，本来 Python 程序就是作为后台服务的角色，只需要监控控件指令即可。</p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs routeros">✅ HMI通信器已启动，端口: COM4<br>✅ 发送: t0.<span class="hljs-attribute">txt</span>=<span class="hljs-string">&quot;Hello World&quot;</span><br>✅ 发送:<span class="hljs-built_in"> page </span>2<br>✅ 发送: t1.<span class="hljs-attribute">txt</span>=<span class="hljs-string">&quot;计数: 1&quot;</span><br></code></pre></td></tr></table></figure>

<p>完整代码如下：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial<br><span class="hljs-keyword">import</span> threading<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">import</span> queue<br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">FixedHMICommunicator</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, port=<span class="hljs-string">&#x27;COM4&#x27;</span>, baudrate=<span class="hljs-number">115200</span></span>):<br>        self.port = port<br>        self.baudrate = baudrate<br>        self.ser = <span class="hljs-literal">None</span><br>        self.send_queue = queue.Queue()<br>        self.running = <span class="hljs-literal">False</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">start</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;启动通信&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">try</span>:<br>            self.ser = serial.Serial(self.port, self.baudrate, timeout=<span class="hljs-number">1</span>)<br>            self.running = <span class="hljs-literal">True</span><br><br>            <span class="hljs-comment"># 启动监听线程</span><br>            listener_thread = threading.Thread(target=self._listener, daemon=<span class="hljs-literal">True</span>)<br>            listener_thread.start()<br><br>            <span class="hljs-comment"># 启动发送线程</span><br>            sender_thread = threading.Thread(target=self._sender, daemon=<span class="hljs-literal">True</span>)<br>            sender_thread.start()<br><br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ HMI通信器已启动，端口: <span class="hljs-subst">&#123;self.port&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span><br><br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 启动失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_listener</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;监听线程&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">while</span> self.running:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-keyword">if</span> self.ser <span class="hljs-keyword">and</span> self.ser.in_waiting &gt; <span class="hljs-number">0</span>:<br>                    data = self.ser.read(self.ser.in_waiting)<br>                    self._process_received_data(data)<br>                time.sleep(<span class="hljs-number">0.01</span>)<br>            <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;监听错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>                time.sleep(<span class="hljs-number">0.1</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_sender</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;发送线程&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">while</span> self.running:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.send_queue.empty():<br>                    command = self.send_queue.get_nowait()<br>                    self._send_command(command)<br>                time.sleep(<span class="hljs-number">0.01</span>)<br>            <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;发送错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>                time.sleep(<span class="hljs-number">0.1</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">send_command</span>(<span class="hljs-params">self, command</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;发送指令&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">if</span> self.running:<br>            self.send_queue.put(command)<br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;❌ 通信器未启动&quot;</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_send_command</span>(<span class="hljs-params">self, command</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;实际发送指令 - 修复编码问题&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(command, <span class="hljs-built_in">str</span>):<br>                <span class="hljs-comment"># 方法1：先编码文本部分，再添加字节结束符</span><br>                <span class="hljs-keyword">if</span> command.endswith(<span class="hljs-string">&#x27;\xFF\xFF\xFF&#x27;</span>):<br>                    <span class="hljs-comment"># 如果字符串已经包含结束符，移除它们</span><br>                    command = command[:-<span class="hljs-number">9</span>]  <span class="hljs-comment"># 移除最后9个字符（\xFF\xFF\xFF）</span><br><br>                <span class="hljs-comment"># 编码文本部分</span><br>                text_encoded = command.encode(<span class="hljs-string">&#x27;gb2312&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br><br>                <span class="hljs-comment"># 添加字节结束符</span><br>                full_command = text_encoded + <span class="hljs-string">b&#x27;\xFF\xFF\xFF&#x27;</span><br><br>                self.ser.write(full_command)<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ 发送成功: <span class="hljs-subst">&#123;command&#125;</span>&quot;</span>)<br><br>            <span class="hljs-keyword">elif</span> <span class="hljs-built_in">isinstance</span>(command, <span class="hljs-built_in">bytes</span>):<br>                <span class="hljs-comment"># 如果已经是字节，直接发送</span><br>                self.ser.write(command)<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ 发送字节数据: <span class="hljs-subst">&#123;command.<span class="hljs-built_in">hex</span>()&#125;</span>&quot;</span>)<br><br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 发送失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">send_command_safe</span>(<span class="hljs-params">self, command_text</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;安全的发送方法 - 推荐使用&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-comment"># 确保命令是字符串</span><br>            <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-built_in">isinstance</span>(command_text, <span class="hljs-built_in">str</span>):<br>                command_text = <span class="hljs-built_in">str</span>(command_text)<br><br>            <span class="hljs-comment"># 编码文本部分</span><br>            text_bytes = command_text.encode(<span class="hljs-string">&#x27;gb2312&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br><br>            <span class="hljs-comment"># 添加结束符</span><br>            full_command = text_bytes + <span class="hljs-string">b&#x27;\xFF\xFF\xFF&#x27;</span><br><br>            <span class="hljs-keyword">if</span> self.running <span class="hljs-keyword">and</span> self.ser:<br>                self.ser.write(full_command)<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;✅ 发送: <span class="hljs-subst">&#123;command_text&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">else</span>:<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;❌ 通信器未就绪&quot;</span>)<br><br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 发送失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_process_received_data</span>(<span class="hljs-params">self, data</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;处理接收数据&quot;&quot;&quot;</span><br>        hex_data = <span class="hljs-string">&#x27; &#x27;</span>.join([<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;b:02X&#125;</span>&#x27;</span> <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> data])<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📥 收到: <span class="hljs-subst">&#123;hex_data&#125;</span>&quot;</span>)<br><br>        <span class="hljs-comment"># 解析触摸事件</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(data) &gt;= <span class="hljs-number">7</span> <span class="hljs-keyword">and</span> data[<span class="hljs-number">0</span>] == <span class="hljs-number">0x65</span> <span class="hljs-keyword">and</span> data[-<span class="hljs-number">3</span>:] == <span class="hljs-string">b&#x27;\xFF\xFF\xFF&#x27;</span>:<br>            page_id = data[<span class="hljs-number">1</span>]<br>            control_id = data[<span class="hljs-number">2</span>]<br>            state = data[<span class="hljs-number">3</span>]<br>            state_text = <span class="hljs-string">&quot;按下&quot;</span> <span class="hljs-keyword">if</span> state == <span class="hljs-number">0x01</span> <span class="hljs-keyword">else</span> <span class="hljs-string">&quot;弹起&quot;</span><br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🔄 触摸: 页面<span class="hljs-subst">&#123;page_id&#125;</span> 控件<span class="hljs-subst">&#123;control_id&#125;</span> <span class="hljs-subst">&#123;state_text&#125;</span>&quot;</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">stop</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-string">&quot;&quot;&quot;停止&quot;&quot;&quot;</span><br>        self.running = <span class="hljs-literal">False</span><br>        <span class="hljs-keyword">if</span> self.ser:<br>            self.ser.close()<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🛑 通信器已停止&quot;</span>)<br><br><span class="hljs-comment"># 使用示例</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():<br>    hmi = FixedHMICommunicator(port=<span class="hljs-string">&#x27;COM4&#x27;</span>, baudrate=<span class="hljs-number">115200</span>)<br><br>    <span class="hljs-keyword">if</span> hmi.start():<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-comment"># 使用安全的发送方法</span><br>            hmi.send_command_safe(<span class="hljs-string">&#x27;t0.txt=&quot;Hello World&quot;&#x27;</span>)<br>            time.sleep(<span class="hljs-number">3</span>)<br><br>            hmi.send_command_safe(<span class="hljs-string">&#x27;page 2&#x27;</span>)<br>            time.sleep(<span class="hljs-number">3</span>)<br><br>            <span class="hljs-comment"># 持续发送测试</span><br>            counter = <span class="hljs-number">0</span><br>            <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>                time.sleep(<span class="hljs-number">3</span>)<br>                counter += <span class="hljs-number">1</span><br>                hmi.send_command_safe(<span class="hljs-string">f&#x27;t1.txt=&quot;计数: <span class="hljs-subst">&#123;counter&#125;</span>&quot;&#x27;</span>)<br><br>        <span class="hljs-keyword">except</span> KeyboardInterrupt:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;\n用户中断&quot;</span>)<br>        <span class="hljs-keyword">finally</span>:<br>            hmi.stop()<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    main()<br></code></pre></td></tr></table></figure>

<hr>
<p>我特么服了，记得二十八号晚些时候写过 Python 联调串口屏的经验来着，连接串口屏后同一时间 USART HMI 编辑器和 Python 程序只能有一个监听 COM5。</p>
<p>要么在模拟器连接到本机串口 COM5，在 USART HMI 软件接收串口屏发来的数据；要么使用 Python 监听串口屏端口 COM5，监听串口屏控件发来的指令，或者使用 Python 程序主动朝串口屏发送信号。</p>
<p>下午，优化完毕串口屏测试程序，接下来可以继续熟悉下串口屏控件编码，以及 Python 联调如何编码。</p>
<p>不想看了，看会儿 Docker。</p>
<blockquote>
<p>2025 年 11 月 28 日</p>
</blockquote>
<p>执行模拟串口通信测试程序：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">test_virtual_ports</span>():<br>    <span class="hljs-string">&quot;&quot;&quot;测试虚拟串口通信&quot;&quot;&quot;</span><br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🔧 测试虚拟串口通信...&quot;</span>)<br><br>    <span class="hljs-keyword">try</span>:<br>        <span class="hljs-comment"># 尝试向COM3发送数据（模拟器监听COM3）</span><br>        ser_send = serial.Serial(<span class="hljs-string">&#x27;COM3&#x27;</span>, <span class="hljs-number">115200</span>, timeout=<span class="hljs-number">1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;✅ 已连接COM3（发送端）&quot;</span>)<br><br>        <span class="hljs-comment"># 尝试从COM4接收数据（Python监听COM4）</span><br>        ser_recv = serial.Serial(<span class="hljs-string">&#x27;COM4&#x27;</span>, <span class="hljs-number">115200</span>, timeout=<span class="hljs-number">1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;✅ 已连接COM4（接收端）&quot;</span>)<br><br>        <span class="hljs-comment"># 发送测试数据</span><br>        test_data = <span class="hljs-string">b&quot;Hello from COM3!\xFF\xFF\xFF&quot;</span><br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📤 向COM3发送: <span class="hljs-subst">&#123;test_data&#125;</span>&quot;</span>)<br>        ser_send.write(test_data)<br><br>        <span class="hljs-comment"># 等待并尝试从COM4接收</span><br>        time.sleep(<span class="hljs-number">0.5</span>)<br>        <span class="hljs-keyword">if</span> ser_recv.in_waiting &gt; <span class="hljs-number">0</span>:<br>            received = ser_recv.read(ser_recv.in_waiting)<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📥 从COM4收到: <span class="hljs-subst">&#123;received&#125;</span>&quot;</span>)<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;✅ 虚拟串口通信正常!&quot;</span>)<br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;❌ 没有收到数据，虚拟串口可能有问题&quot;</span>)<br><br>        ser_send.close()<br>        ser_recv.close()<br><br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 测试失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br></code></pre></td></tr></table></figure>

<p>测试结果：</p>
<figure class="highlight erlang-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs erlang-repl">send.py::test_virtual_ports PASSED                                       [<span class="hljs-number">100</span><span class="hljs-comment">%]🔧 测试虚拟串口通信...</span><br>✅ 已连接COM3（发送端）<br>✅ 已连接COM4（接收端）<br>📤 向COM3发送: b&#x27;Hello from COM3!\xff\xff\xff&#x27;<br>📥 从COM4收到: b&#x27;Hello from COM3!\xff\xff\xff&#x27;<br>✅ 虚拟串口通信正常!<br></code></pre></td></tr></table></figure>

<p>执行监听按钮点击事件完整程序：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">advanced_button_listener</span>():<br>    <span class="hljs-string">&quot;&quot;&quot;监听按钮点击事件的完整程序&quot;&quot;&quot;</span><br>    <span class="hljs-keyword">try</span>:<br>        <span class="hljs-comment"># 连接COM4（模拟器连接COM3）</span><br>        ser = serial.Serial(<span class="hljs-string">&#x27;COM4&#x27;</span>, <span class="hljs-number">115200</span>, timeout=<span class="hljs-number">1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🎯 按钮监听程序已启动&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;📡 监听COM4，等待COM3的模拟器信号&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;请在模拟器中点击配置了&#x27;触摸发送&#x27;的按钮&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;按Ctrl+C停止监听\n&quot;</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;-&quot;</span> * <span class="hljs-number">60</span>)<br><br>        receive_count = <span class="hljs-number">0</span><br><br>        <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>            <span class="hljs-comment"># 检查是否有数据</span><br>            <span class="hljs-keyword">if</span> ser.in_waiting &gt; <span class="hljs-number">0</span>:<br>                data = ser.read(ser.in_waiting)<br>                receive_count += <span class="hljs-number">1</span><br>                current_time = datetime.now().strftime(<span class="hljs-string">&quot;%H:%M:%S&quot;</span>)<br><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\n🕒 [<span class="hljs-subst">&#123;current_time&#125;</span>] 第<span class="hljs-subst">&#123;receive_count&#125;</span>次收到数据:&quot;</span>)<br><br>                <span class="hljs-comment"># 显示十六进制</span><br>                hex_data = <span class="hljs-string">&#x27; &#x27;</span>.join([<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;b:02X&#125;</span>&#x27;</span> <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> data])<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🔢 原始数据: <span class="hljs-subst">&#123;hex_data&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 尝试解析为文本</span><br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-comment"># 尝试UTF-8解码</span><br>                    text_utf8 = data.decode(<span class="hljs-string">&#x27;utf-8&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br>                    <span class="hljs-comment"># 尝试GB2312解码（中文常用）</span><br>                    text_gb = data.decode(<span class="hljs-string">&#x27;gb2312&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br><br>                    <span class="hljs-comment"># 显示可读部分</span><br>                    clean_utf8 = <span class="hljs-string">&#x27;&#x27;</span>.join(c <span class="hljs-keyword">if</span> <span class="hljs-number">32</span> &lt;= <span class="hljs-built_in">ord</span>(c) &lt;= <span class="hljs-number">126</span> <span class="hljs-keyword">else</span> <span class="hljs-string">f&#x27;[<span class="hljs-subst">&#123;<span class="hljs-built_in">ord</span>(c):02X&#125;</span>]&#x27;</span> <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> text_utf8)<br>                    clean_gb = <span class="hljs-string">&#x27;&#x27;</span>.join(c <span class="hljs-keyword">if</span> <span class="hljs-number">32</span> &lt;= <span class="hljs-built_in">ord</span>(c) &lt;= <span class="hljs-number">126</span> <span class="hljs-keyword">else</span> <span class="hljs-string">f&#x27;[<span class="hljs-subst">&#123;<span class="hljs-built_in">ord</span>(c):02X&#125;</span>]&#x27;</span> <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> text_gb)<br><br>                    <span class="hljs-keyword">if</span> clean_utf8.strip():<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📝 UTF-8文本: <span class="hljs-subst">&#123;clean_utf8&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">if</span> clean_gb.strip() <span class="hljs-keyword">and</span> clean_gb != clean_utf8:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;📝 GB2312文本: <span class="hljs-subst">&#123;clean_gb&#125;</span>&quot;</span>)<br>                <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 解码错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 解析标准触摸事件 (65 PP PP CC CC SS FF FF FF)</span><br>                <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(data) &gt;= <span class="hljs-number">6</span> <span class="hljs-keyword">and</span> data[<span class="hljs-number">0</span>] == <span class="hljs-number">0x65</span>:<br>                    page_id = (data[<span class="hljs-number">1</span>] &lt;&lt; <span class="hljs-number">8</span>) | data[<span class="hljs-number">2</span>]<br>                    control_id = (data[<span class="hljs-number">3</span>] &lt;&lt; <span class="hljs-number">8</span>) | data[<span class="hljs-number">4</span>]<br>                    state = data[<span class="hljs-number">5</span>]<br><br>                    <span class="hljs-keyword">if</span> state == <span class="hljs-number">0x01</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🟢 按钮按下! 页面<span class="hljs-subst">&#123;page_id&#125;</span> 控件<span class="hljs-subst">&#123;control_id&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">elif</span> state == <span class="hljs-number">0x00</span>:  <br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;🔴 按钮释放! 页面<span class="hljs-subst">&#123;page_id&#125;</span> 控件<span class="hljs-subst">&#123;control_id&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">else</span>:<br>                        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❓ 未知状态: <span class="hljs-subst">&#123;state:02X&#125;</span>&quot;</span>)<br><br>                <span class="hljs-comment"># 检查是否包含常见指令</span><br>                <span class="hljs-keyword">if</span> <span class="hljs-string">b&#x27;button&#x27;</span> <span class="hljs-keyword">in</span> data.lower() <span class="hljs-keyword">or</span> <span class="hljs-string">b&#x27;click&#x27;</span> <span class="hljs-keyword">in</span> data.lower():<br>                    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🎯 检测到按钮相关指令!&quot;</span>)<br><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;-&quot;</span> * <span class="hljs-number">50</span>)<br><br>            time.sleep(<span class="hljs-number">0.05</span>)  <span class="hljs-comment"># 更快的响应</span><br><br>    <span class="hljs-keyword">except</span> KeyboardInterrupt:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\n🛑 监听结束，共收到 <span class="hljs-subst">&#123;receive_count&#125;</span> 次数据&quot;</span>)<br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;❌ 错误: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>    <span class="hljs-keyword">finally</span>:<br>        <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;ser&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">locals</span>() <span class="hljs-keyword">and</span> ser.is_open:<br>            ser.close()<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;🔒 串口已关闭&quot;</span>)<br></code></pre></td></tr></table></figure>

<p>测试结果：</p>
<figure class="highlight erlang-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs erlang-repl">send.py::test_virtual_ports PASSED                                       [<span class="hljs-number">100</span><span class="hljs-comment">%]🔧 测试虚拟串口通信...</span><br>✅ 已连接COM3（发送端）<br>✅ 已连接COM4（接收端）<br>📤 向COM3发送: b&#x27;Hello from COM3!\xff\xff\xff&#x27;<br>📥 从COM4收到: b&#x27;Hello from COM3!\xff\xff\xff&#x27;<br>✅ 虚拟串口通信正常!<br></code></pre></td></tr></table></figure>

<p>Python 对COM3串口发送指令正常，监听COM4接受指令也正常，那就是模拟器操作控件肯定没有正常发送信号，估计得先编码控件。</p>
<p>这个AI的回复不能信服。</p>
<p>今天晚些时候再测。</p>
<blockquote>
<p>2025 年 11 月 27 日</p>
</blockquote>
<p>考虑到生产环境下的应用场景，使用 Python 脚本在后台监听模拟器或串口屏操作信号。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">diagnose_connection</span>():<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;=== 串口连接诊断 ===&quot;</span>)<br><br>    <span class="hljs-comment"># 1. 列出所有可用串口</span><br>    ports = serial.tools.list_ports.comports()<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;1. 可用串口列表:&quot;</span>)<br>    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> ports:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;   ❌ 没有找到任何串口设备&quot;</span>)<br>        <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br>    <span class="hljs-keyword">for</span> port <span class="hljs-keyword">in</span> ports:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;   ✅ <span class="hljs-subst">&#123;port.device&#125;</span> - <span class="hljs-subst">&#123;port.description&#125;</span>&quot;</span>)<br><br>    <span class="hljs-comment"># 2. 尝试连接指定串口</span><br>    target_port = <span class="hljs-string">&#x27;COM4&#x27;</span>  <span class="hljs-comment"># 修改为您的端口号</span><br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\n2. 尝试连接 <span class="hljs-subst">&#123;target_port&#125;</span>&quot;</span>)<br><br>    <span class="hljs-keyword">try</span>:<br>        ser = serial.Serial(target_port, <span class="hljs-number">9600</span>, timeout=<span class="hljs-number">2</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;   ✅ 成功连接到 <span class="hljs-subst">&#123;target_port&#125;</span>&quot;</span>)<br>        ser.close()<br>        <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span><br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;   ❌ 连接失败: <span class="hljs-subst">&#123;e&#125;</span>&quot;</span>)<br>        <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br><br><span class="hljs-comment"># 使用示例</span><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    <span class="hljs-comment"># 修改为您的虚拟串口号（模拟器连接的那个端口）</span><br>    <span class="hljs-comment"># monitor_button_press(port=&#x27;COM4&#x27;, baudrate=115200)</span><br>    diagnose_connection()<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">Traceback (most recent call last):<br>  File <span class="hljs-string">&quot;D:\Project\python\python通讯\python测试\test1127.py&quot;</span>, line 85, <span class="hljs-keyword">in</span> &lt;module&gt;<br>    diagnose_connection()<br>    ~~~~~~~~~~~~~~~~~~~^^<br>  File <span class="hljs-string">&quot;D:\Project\python\python通讯\python测试\test1127.py&quot;</span>, line 58, <span class="hljs-keyword">in</span> diagnose_connection<br>    ports = serial.tools.list_ports.comports()<br>            ^^^^^^^^^^^^<br>AttributeError: module <span class="hljs-string">&#x27;serial&#x27;</span> has no attribute <span class="hljs-string">&#x27;tools&#x27;</span><br><br></code></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial<br><span class="hljs-keyword">from</span> serial.tools <span class="hljs-keyword">import</span> list_ports<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 11 月 26 日</p>
</blockquote>
<p>今天继续抽时间进一步优化串口屏调试。</p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/debug_with_sscom.html">串口助手软件(sscom)和屏幕联调 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">USART</span>（Universal Synchronous/Asynchronous Receiver/Transmitter）是一种全双工通用同步/异步串行收发模块，作为高度灵活的串行通信设备，支持相互独立的收发数据操作。其核心功能涵盖同步/异步双模式运行，可配置<span class="hljs-number">5</span>至<span class="hljs-number">9</span>位数据位及<span class="hljs-number">1</span>-<span class="hljs-number">2</span>位停止位，内置硬件奇偶校验、数据溢出检测、帧错误检测等机制，并具备三级中断支持。<br></code></pre></td></tr></table></figure>

<p>妈的昨天看串口调试助手看走眼了，还以为有官方提供的虚拟串口设备，结果只是提供了同串口屏协作的调试助手而已。</p>
<p>这些调试助手包括但不限于：sscom，uartassist，xcom，llcom。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">串口屏与单片机联调，与Arduino联调，与MicroPython联调，与Python联调，这些都是什么。<br></code></pre></td></tr></table></figure>

<p>这些都是在不同环境下与淘晶驰串口屏进行通信和调试的场景。它们的目标一致：让外部设备或程序能够控制串口屏的显示，并接收串口屏的触摸等事件。但使用的工具和编程语言不同。</p>
<p><strong>单片机</strong>：如STM32、51系列等，是嵌入式设备的核心控制芯片。</p>
<p><strong>Arduino</strong>：一种开源的电子原型平台，使用C++风格的Arduino语言，编程简单。</p>
<p><strong>MicroPython</strong>：是运行在微控制器上的Python语言。</p>
<p><strong>Python</strong>：这里通常指在电脑上运行的Python程序。</p>
<p>本质上都是通过串口协议与屏幕通信，只是编程语言和运行环境不同。</p>
<p>晚十点半，下载周一编码完成的控件到串口屏，执行操作发送到本机模拟器和串口屏，成功了，他妈的联调成功。</p>
<p>本机启动模拟器，确保正确下载完成控件程序到串口屏后，HMI 提供的模拟器调试键盘输入，能正确操作连接在本机上的串口屏。</p>
<p>停止模拟器调试，只是单纯把串口屏插在本机上，我的串口屏联机用到的串口号是COM5，注意这里只有一个串口号，那就是串口屏的串口号，启动Python程序直接发送信号到COM5，翻页成功。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial <span class="hljs-comment">#导入模块</span><br><br><span class="hljs-comment"># print(serial.__file__)</span><br><span class="hljs-comment"># print(dir(serial))</span><br><span class="hljs-comment"># print(serial.file)</span><br><br><span class="hljs-keyword">try</span>:<br>  ser=serial.Serial(port=<span class="hljs-string">&quot;COM5&quot;</span>,baudrate=<span class="hljs-number">115200</span>,timeout=<span class="hljs-number">5</span>)<br>  command = <span class="hljs-string">b&quot;page page0\xff\xff\xff&quot;</span><br>  ser.write(command)<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;发送页面切换指令&quot;</span>)<br><br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;---异常---：&quot;</span>,e)<br></code></pre></td></tr></table></figure>

<p>同样的，改写文本字符也成功了。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial <span class="hljs-comment">#导入模块</span><br><br><span class="hljs-comment"># print(serial.__file__)</span><br><span class="hljs-comment"># print(dir(serial))</span><br><span class="hljs-comment"># print(serial.file)</span><br><br><span class="hljs-keyword">try</span>:<br>  <span class="hljs-comment">#端口，GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM1 等</span><br>  <span class="hljs-comment">#波特率，标准值：2400 4800 9600 19200 38400 57600 115200 230400 256000 512000 921600</span><br>  <span class="hljs-comment">#超时设置,None：永远等待操作，0为立即返回请求结果，其他值为等待超时时间(单位为秒）</span><br>  <span class="hljs-comment"># 打开串口，并得到串口对象</span><br>    ser=serial.Serial(port=<span class="hljs-string">&quot;COM5&quot;</span>,baudrate=<span class="hljs-number">115200</span>,timeout=<span class="hljs-number">5</span>)<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;串口详情参数：&quot;</span>, ser)<br>  <span class="hljs-comment"># 写数据</span><br>    <span class="hljs-comment">#注意：编码应与工程的编码一致（设备-字符编码，如果usarthmi中设置的为utf-8，则这里也填写utf8，如果usarthmi中设置的为GB2312，则这里也填写GB2312也可以填写GBK）</span><br>    <span class="hljs-comment">#result=ser.write(&quot;page page0&quot;.encode(&quot;utf-8&quot;))</span><br>    <span class="hljs-comment">#result=ser.write(&quot;page page2&quot;.encode(&quot;GB2312&quot;))</span><br>    result=ser.write(<span class="hljs-string">&quot;t0.txt=\&quot;淘晶驰电子！\&quot;&quot;</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br>  <span class="hljs-comment"># 发送结束符</span><br>    ser.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br><br>    ser.close()<span class="hljs-comment">#关闭串口</span><br><br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;---异常---：&quot;</span>,e)<br></code></pre></td></tr></table></figure>

<p>今天的调试结束。</p>
<blockquote>
<p>2025 年 11 月 25 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/index.html">淘晶驰资料中心 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p><strong>与 Python 联调。</strong></p>
<p>Python 发送数据给屏幕工程。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial <span class="hljs-comment">#导入模块</span><br><span class="hljs-keyword">try</span>:<br><span class="hljs-comment">#端口，GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM1 等</span><br><span class="hljs-comment">#波特率，标准值：2400 4800 9600 19200 38400 57600 115200 230400 256000 512000 921600</span><br><span class="hljs-comment">#超时设置,None：永远等待操作，0为立即返回请求结果，其他值为等待超时时间(单位为秒）</span><br><span class="hljs-comment"># 打开串口，并得到串口对象</span><br>    ser=serial.Serial(port=<span class="hljs-string">&quot;COM9&quot;</span>,baudrate=<span class="hljs-number">115200</span>,timeout=<span class="hljs-number">5</span>)<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;串口详情参数：&quot;</span>, ser)<br><span class="hljs-comment"># 写数据</span><br>    <span class="hljs-comment">#注意：编码应与工程的编码一致（设备-字符编码，如果usarthmi中设置的为utf-8，则这里也填写utf8，如果usarthmi中设置的为GB2312，则这里也填写GB2312也可以填写GBK）</span><br>    <span class="hljs-comment">#result=ser.write(&quot;page page0&quot;.encode(&quot;utf-8&quot;))</span><br>    <span class="hljs-comment">#result=ser.write(&quot;page page2&quot;.encode(&quot;GB2312&quot;))</span><br>    result=ser.write(<span class="hljs-string">&quot;t0.txt=\&quot;淘晶驰电子！\&quot;&quot;</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br><span class="hljs-comment"># 发送结束符</span><br>    ser.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br><br>    ser.close()<span class="hljs-comment">#关闭串口</span><br><br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;---异常---：&quot;</span>,e)<br></code></pre></td></tr></table></figure>

<p>这段代码是一个<strong>串口通信程序</strong>，主要用于与<strong>淘晶驰串口屏（HMI人机界面）</strong>进行通信和控制。</p>
<p>代码执行流程：</p>
<ol>
<li>打开COM9串口</li>
<li>发送显示文本指令</li>
<li>发送结束标志</li>
<li>关闭串口</li>
</ol>
<p>Python 获取电脑状态。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">import</span> psutil<br><span class="hljs-keyword">import</span> serial<br><br>time.sleep(<span class="hljs-number">3</span>)<br><br><span class="hljs-comment"># function of Get CPU State;</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">getCPUstate</span>(<span class="hljs-params">interval=<span class="hljs-number">1</span></span>):<br>    <span class="hljs-keyword">return</span> (<span class="hljs-string">&quot; CPU: &quot;</span> + <span class="hljs-built_in">str</span>(psutil.cpu_percent(interval)) + <span class="hljs-string">&quot;%&quot;</span>)<br><br><br><span class="hljs-comment"># function of Get Memory</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">getMemorystate</span>():<br>    phymem = psutil.virtual_memory()<br>    line = <span class="hljs-string">&quot;Memory: %5s%% %6s/%s&quot;</span> % (<br>        phymem.percent,<br>        <span class="hljs-built_in">str</span>(<span class="hljs-built_in">int</span>(phymem.used / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span>)) + <span class="hljs-string">&quot;M&quot;</span>,<br>        <span class="hljs-built_in">str</span>(<span class="hljs-built_in">int</span>(phymem.total / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span>)) + <span class="hljs-string">&quot;M&quot;</span><br>    )<br>    <span class="hljs-keyword">return</span> line<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">bytes2human</span>(<span class="hljs-params">n</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    &gt;&gt;&gt; bytes2human(10000)</span><br><span class="hljs-string">    &#x27;9.8 K&#x27;</span><br><span class="hljs-string">    &gt;&gt;&gt; bytes2human(100001221)</span><br><span class="hljs-string">    &#x27;95.4 M&#x27;</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    symbols = (<span class="hljs-string">&#x27;K&#x27;</span>, <span class="hljs-string">&#x27;M&#x27;</span>, <span class="hljs-string">&#x27;G&#x27;</span>, <span class="hljs-string">&#x27;T&#x27;</span>, <span class="hljs-string">&#x27;P&#x27;</span>, <span class="hljs-string">&#x27;E&#x27;</span>, <span class="hljs-string">&#x27;Z&#x27;</span>, <span class="hljs-string">&#x27;Y&#x27;</span>)<br>    prefix = &#123;&#125;<br>    <span class="hljs-keyword">for</span> i, s <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(symbols):<br>        prefix[s] = <span class="hljs-number">1</span> &lt;&lt; (i + <span class="hljs-number">1</span>) * <span class="hljs-number">10</span><br>    <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> <span class="hljs-built_in">reversed</span>(symbols):<br>        <span class="hljs-keyword">if</span> n &gt;= prefix[s]:<br>            value = <span class="hljs-built_in">float</span>(n) / prefix[s]<br>            <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;%.2f %s&#x27;</span> % (value, s)<br>    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;%.2f B&#x27;</span> % (n)<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">poll</span>(<span class="hljs-params">interval</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;Retrieve raw stats within an interval window.&quot;&quot;&quot;</span><br>    tot_before = psutil.net_io_counters()<br>    pnic_before = psutil.net_io_counters(pernic=<span class="hljs-literal">True</span>)<br>    <span class="hljs-comment"># sleep some time</span><br>    time.sleep(interval)<br>    tot_after = psutil.net_io_counters()<br>    pnic_after = psutil.net_io_counters(pernic=<span class="hljs-literal">True</span>)<br>    <span class="hljs-comment"># get cpu state</span><br>    cpu_state = getCPUstate(interval)<br>    <span class="hljs-comment"># get memory</span><br>    memory_state = getMemorystate()<br>    <span class="hljs-keyword">return</span> (tot_before, tot_after, pnic_before, pnic_after, cpu_state, memory_state)<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">refresh_window</span>(<span class="hljs-params">tot_before, tot_after, pnic_before, pnic_after, cpu_state, memory_state</span>):<br><br>    <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;t0.txt=\&quot;&quot;</span> + time.asctime() + <span class="hljs-string">&quot; | &quot;</span> + cpu_state + <span class="hljs-string">&quot; | &quot;</span> + memory_state + <span class="hljs-string">&quot;\&quot;&quot;</span><br><br>    serial.write(<span class="hljs-built_in">str</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br>    serial.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br><br>    nic_names = pnic_after.keys()<br>    <span class="hljs-comment"># nic_names.sort(key=lambda x: sum(pnic_after[x]), reverse=True)</span><br><br>    <span class="hljs-keyword">for</span> name <span class="hljs-keyword">in</span> nic_names:<br>        <span class="hljs-comment"># 有线一般是以太网,无线则是WLAN,具体请查看&quot;控制面板\网络和 Internet\网络连接&quot;</span><br>        <span class="hljs-keyword">if</span> name == <span class="hljs-string">&quot;以太网&quot;</span>:<br>            stats_before = pnic_before[name]<br>            stats_after = pnic_after[name]<br>            templ = <span class="hljs-string">&quot;%-15s %15s %15s&quot;</span><br>            <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;t1.txt=\&quot;上传数据总量&quot;</span> + bytes2human(stats_after.bytes_sent) + <span class="hljs-string">&quot;   上传速度:&quot;</span> + bytes2human(stats_after.bytes_sent - stats_before.bytes_sent) + <span class="hljs-string">&#x27;/s\&quot;&#x27;</span><br>            serial.write(<span class="hljs-built_in">str</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br>            serial.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br>            <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;t2.txt=\&quot;下载数据总量&quot;</span> + bytes2human(stats_after.bytes_recv) + <span class="hljs-string">&quot;   下载速度:&quot;</span> + bytes2human(stats_after.bytes_recv - stats_before.bytes_recv) + <span class="hljs-string">&#x27;/s\&quot;&#x27;</span><br>            serial.write(<span class="hljs-built_in">str</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br>            serial.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br>      <br>    <br><span class="hljs-keyword">try</span>:<br>    interval = <span class="hljs-number">0</span><br>    portx = <span class="hljs-string">&quot;COM9&quot;</span><br>    bauds = <span class="hljs-number">115200</span><br>    timex = <span class="hljs-number">5</span><br>    serial = serial.Serial(port=portx,baudrate=bauds,timeout=timex)<br>    <span class="hljs-keyword">while</span> <span class="hljs-number">1</span>:<br>        args = poll(interval)<br>        refresh_window(*args)<br>        interval = <span class="hljs-number">1</span><br><span class="hljs-keyword">except</span> (KeyboardInterrupt, SystemExit):<br>    <span class="hljs-keyword">pass</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">pip install psutil<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">pip install serial<br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">pip uninstall serial pyserial</span><br></code></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(serial.__file__)<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">dir</span>(serial))<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">C:\Users\Lenovo\AppData\Local\Programs\Python\Python314\Lib\site-packages\serial\__init__.py<br><br>[<span class="hljs-string">&#x27;CR&#x27;</span>, <span class="hljs-string">&#x27;EIGHTBITS&#x27;</span>, <span class="hljs-string">&#x27;FIVEBITS&#x27;</span>, <span class="hljs-string">&#x27;LF&#x27;</span>, <span class="hljs-string">&#x27;PARITY_EVEN&#x27;</span>, <span class="hljs-string">&#x27;PARITY_MARK&#x27;</span>, <span class="hljs-string">&#x27;PARITY_NAMES&#x27;</span>, <span class="hljs-string">&#x27;PARITY_NONE&#x27;</span>, <span class="hljs-string">&#x27;PARITY_ODD&#x27;</span>, <span class="hljs-string">&#x27;PARITY_SPACE&#x27;</span>, <span class="hljs-string">&#x27;PortNotOpenError&#x27;</span>, <span class="hljs-string">&#x27;SEVENBITS&#x27;</span>, <span class="hljs-string">&#x27;SIXBITS&#x27;</span>, <span class="hljs-string">&#x27;STOPBITS_ONE&#x27;</span>, <span class="hljs-string">&#x27;STOPBITS_ONE_POINT_FIVE&#x27;</span>, <span class="hljs-string">&#x27;STOPBITS_TWO&#x27;</span>, <span class="hljs-string">&#x27;Serial&#x27;</span>, <span class="hljs-string">&#x27;SerialBase&#x27;</span>, <span class="hljs-string">&#x27;SerialException&#x27;</span>, <span class="hljs-string">&#x27;SerialTimeoutException&#x27;</span>, <span class="hljs-string">&#x27;Timeout&#x27;</span>, <span class="hljs-string">&#x27;VERSION&#x27;</span>, <span class="hljs-string">&#x27;XOFF&#x27;</span>, <span class="hljs-string">&#x27;XON&#x27;</span>, <span class="hljs-string">&#x27;__builtins__&#x27;</span>, <span class="hljs-string">&#x27;__cached__&#x27;</span>, <span class="hljs-string">&#x27;__doc__&#x27;</span>, <span class="hljs-string">&#x27;__file__&#x27;</span>, <span class="hljs-string">&#x27;__loader__&#x27;</span>, <span class="hljs-string">&#x27;__name__&#x27;</span>, <span class="hljs-string">&#x27;__package__&#x27;</span>, <span class="hljs-string">&#x27;__path__&#x27;</span>, <span class="hljs-string">&#x27;__spec__&#x27;</span>, <span class="hljs-string">&#x27;__version__&#x27;</span>, <span class="hljs-string">&#x27;absolute_import&#x27;</span>, <span class="hljs-string">&#x27;basestring&#x27;</span>, <span class="hljs-string">&#x27;importlib&#x27;</span>, <span class="hljs-string">&#x27;io&#x27;</span>, <span class="hljs-string">&#x27;iterbytes&#x27;</span>, <span class="hljs-string">&#x27;os&#x27;</span>, <span class="hljs-string">&#x27;protocol_handler_packages&#x27;</span>, <span class="hljs-string">&#x27;serial_for_url&#x27;</span>, <span class="hljs-string">&#x27;serialutil&#x27;</span>, <span class="hljs-string">&#x27;serialwin32&#x27;</span>, <span class="hljs-string">&#x27;sys&#x27;</span>, <span class="hljs-string">&#x27;time&#x27;</span>, <span class="hljs-string">&#x27;to_bytes&#x27;</span>, <span class="hljs-string">&#x27;unicode&#x27;</span>, <span class="hljs-string">&#x27;win32&#x27;</span>]<br></code></pre></td></tr></table></figure>

<p>pyserial<code>库已正确安装，Python 正在使用正确版本的 </code>serial`模块，模块路径指向标准的 site-packages 目录。</p>
<p>妈的，又不报错了，执行结果如下。</p>
<figure class="highlight nsis"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nsis">---异常---： could not <span class="hljs-literal">open</span> port <span class="hljs-string">&#x27;COM2&#x27;</span>: FileNotFoundError(<span class="hljs-number">2</span>, <span class="hljs-string">&#x27;系统找不到指定的文件。&#x27;</span>, <span class="hljs-literal">None</span>, <span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure>

<p>先把控件详解和基本指令集看完。</p>
<p><strong>控件详解。</strong></p>
<p>控件详解，挨个把所有控件用途和属性大概过一遍。</p>
<p>Python 通信。</p>
<p>[<a target="_blank" rel="noopener" href="http://www.3fwork.com/kaifa209/001568MYM001064/">嵌入式] USART HMI智能串口屏 一篇就够！保姆级教程</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_35794316/article/details/147689093">虚拟串口驱动详解与应用实践指南-CSDN博客</a></p>
<figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">  File &quot;C:\Users\Lenovo\AppData\Local\Programs\Python\Python314\Lib\site-packages\serial\serialwin32.py&quot;, <span class="hljs-type">line</span> <span class="hljs-number">64</span>, <span class="hljs-keyword">in</span> <span class="hljs-keyword">open</span><br>    <span class="hljs-keyword">raise</span> SerialException(&quot;could not open port &#123;!r&#125;: &#123;!r&#125;&quot;.format(self.portstr, ctypes.WinError()))<br><span class="hljs-type">serial</span>.serialutil.SerialException: could <span class="hljs-keyword">not</span> <span class="hljs-keyword">open</span> port <span class="hljs-string">&#x27;COM9&#x27;</span>: FileNotFoundError(<span class="hljs-number">2</span>, <span class="hljs-string">&#x27;系统找不到指定的文件。&#x27;</span>, <span class="hljs-keyword">None</span>, <span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure>

<p><strong>com0com。</strong></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_44322019/article/details/147443202">com0com虚拟串口使用教程-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://sourceforge.net/projects/com0com/files/latest/download">Download Null-modem emulator</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251125162340876.png" alt="image-20251125162340876"></p>
<p>安装之后有人会出现带黄色感叹号这种，操作系统设置-高级启动-禁用强制驱动程序签名就可以，或者找其他博主的解决方案，因为我的电脑没出现，所以没办法验证方法的可行性。</p>
<p><img src="http://blog.memory-life.xyz/image-20251125162418397.png" alt="image-20251125162418397"></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_43162090/article/details/154915338">虚拟串口com0com安装后设备管理器是感叹号的解决办法_安装虚拟com 黄色感叹号-CSDN博客</a></p>
<p>直接在设置/Windows更新/高级选项/可选更新下面选择。</p>
<p><img src="http://blog.memory-life.xyz/image-20251125162845479.png" alt="image-20251125162845479"></p>
<figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gcode">安装co<span class="hljs-name">m0</span>com软件后在设备管理器中虚拟串口黄色感叹号<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/chenludaniel/article/details/150857452">win11在安装com0com软件后，在设备管理器中虚拟串口黄色感叹号得解决方法_com0com 黄色感叹号-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_43162090/article/details/154915338">虚拟串口com0com安装后设备管理器是感叹号的解决办法_安装虚拟com 黄色感叹号-CSDN博客</a></p>
<p>解决了。</p>
<p>下载串口调试工具，测试虚拟串口能不能正常工作，USART HMI 程序尝试联机虚拟串口失败，试下重启软件和重启电脑后管不管用。</p>
<p>应该没什么问题。</p>
<figure class="highlight dos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dos">点击连接本机虚拟串口后，左下角显示尝试联机<span class="hljs-built_in">COM3</span>:<span class="hljs-number">2400</span>，这是什么意思，为什么点击联机后软件卡死了呢。<br></code></pre></td></tr></table></figure>

<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">USART</span> HMI怎么修改联机波特率。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://zhidao.baidu.com/question/510681613486393004.html">触摸屏PPI通信如何更改波特率_百度知道</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251125173604479.png" alt="image-20251125173604479"></p>
<p>虚拟串口是成对出现的。com0com创建了一对虚拟串口，比如COM3和COM4。这两个端口是相互连接的：发送到COM3的数据会被COM4接收，反之亦然。</p>
<p>所以，正确的做法是：</p>
<ol>
<li>将USART HMI程序连接到其中一个虚拟串口（例如COM3）</li>
<li>将Python程序连接到另一个虚拟串口（例如COM4）</li>
</ol>
<p>这样，当Python程序向COM4写入数据时，USART HMI程序从COM3读取数据；当USART HMI程序向COM3写入数据时，Python程序从COM4读取数据。</p>
<p>测试成功。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> serial <span class="hljs-comment">#导入模块</span><br><span class="hljs-keyword">try</span>:<br>    ser=serial.Serial(port=<span class="hljs-string">&quot;COM4&quot;</span>,baudrate=<span class="hljs-number">115200</span>,timeout=<span class="hljs-number">5</span>)<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;串口详情参数：&quot;</span>, ser)<br><br>    <span class="hljs-comment">#result=ser.write(&quot;page page0&quot;.encode(&quot;utf-8&quot;))</span><br>    <span class="hljs-comment">#result=ser.write(&quot;page page2&quot;.encode(&quot;GB2312&quot;))</span><br>    result=ser.write(<span class="hljs-string">&quot;t0.txt=\&quot;淘晶驰电子！\&quot;&quot;</span>.encode(<span class="hljs-string">&quot;GB2312&quot;</span>))<br><br>    ser.write(<span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">&#x27;ff ff ff&#x27;</span>))<br>    ser.close()<span class="hljs-comment">#关闭串口</span><br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;---异常---：&quot;</span>,e)<br></code></pre></td></tr></table></figure>

<p>模拟器勾选用户MCU输入，自定义波特率 115200 并选择本机虚拟串口号COM3，点击开始监听；本机启动 Python 程序向虚拟串口号COM4发送数据，模拟器响应正常。</p>
<p>今天的工作结束了。</p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/debug_with_vspd.html">串口助手软件(sscom)和串口屏模拟器联调1 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p>串口助手软件可以下载安装官网推荐的 sscom。</p>
<blockquote>
<p>2025 年 11 月 24 日</p>
</blockquote>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs arduino"><span class="hljs-number">1.</span>硬件建设<br>基于信创技术路线，研发一套适配监测运维系统的专用设备。要求处理器、操作系统都在信创名录，支持<span class="hljs-number">4.3</span> 英寸<span class="hljs-number">480</span>x1920分辨率的<span class="hljs-built_in">TFT</span> 显示屏，具备常用的IO输入输出功能。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/irqhandler/article/details/84570463">usart hmi(串口屏)介绍-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="http://wiki.sany-semi.com/qianyan.html">前言 — 三易串口屏开发指南 1.4.0 文档</a></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/index.html">淘晶驰资料中心 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/start/index.html">快速入门 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251124095011903.png" alt="image-20251124095011903"></p>
<p>淘晶驰串口屏官网，下载安装 USART HMI 上机位开发软件。</p>
<p>下载安装。</p>
<p>USB 转 TTL 模块还没到，估计这个模块物流到了之后就能正常连接串口屏进行开发了，先看官网学习下怎么开发。</p>
<figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs makefile"><span class="hljs-section">总可用内存:3584</span><br><span class="hljs-section">全局内存占用:16</span><br><span class="hljs-section">错误:页面:page0 失败:t0.font 初始值无效:字库ID无效</span><br><span class="hljs-section">错误:编译失败! 1个错误, 0个警告</span><br></code></pre></td></tr></table></figure>

<p>先解决下这个问题。</p>
<p>工具栏下点击字库制作，解决问题。</p>
<p><img src="http://blog.memory-life.xyz/image-20251124111137745.png" alt="image-20251124111137745"></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/start/first_test.html#usbttl">到手测试 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<hr>
<figure class="highlight mel"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mel">用  USART HMI 软件开发串口屏应用，用到了什么语言？能使用<span class="hljs-keyword">python</span>脚本帮助开发吗<br></code></pre></td></tr></table></figure>

<p>了解USART HMI串口屏应用的开发语言以及Python的辅助开发方式很有用。简单来说，<strong>核心的界面设计和逻辑控制使用了一套类似C语言的专用脚本，而Python则可以作为强大的辅助工具，在特定场景下大显身手</strong>。</p>
<p>下面这个表格能帮你快速了解不同语言在USART HMI开发中的角色。</p>
<table>
<thead>
<tr>
<th align="left">开发环节/用途</th>
<th align="left">主要使用语言/技术</th>
<th align="left">Python的可参与性</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>串口屏界面逻辑</strong></td>
<td align="left">USART HMI专用脚本 (类C语言)</td>
<td align="left"><strong>无法直接使用</strong>。屏幕固件只解析专用指令。</td>
</tr>
<tr>
<td align="left"><strong>下位机(单片机)程序</strong></td>
<td align="left">C / C++ (如STM32的Arduino、HAL库)</td>
<td align="left"><strong>可以</strong>。通过<strong>PySerial</strong>库控制串口与屏幕通信。</td>
</tr>
<tr>
<td align="left"><strong>上位机(PC)测试工具</strong></td>
<td align="left">通常为C++(Qt)/C#(WinForm)等</td>
<td align="left"><strong>非常适合</strong>。Python(PyQt/PySerial)可快速搭建调试助手。</td>
</tr>
<tr>
<td align="left"><strong>嵌入式脚本控制器</strong></td>
<td align="left">通常为C/C++</td>
<td align="left"><strong>可以</strong>。在运行MicroPython的ESP32/ESP8266等单片机上，可直接用Python驱动屏幕。</td>
</tr>
</tbody></table>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">那么使用 Pycharm 编辑器能达到跟 USART HMI 一样的开发效果吗？<br></code></pre></td></tr></table></figure>

<table>
<thead>
<tr>
<th align="left">特性维度</th>
<th align="left">USART HMI 软件</th>
<th align="left">PyCharm</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>核心定位</strong></td>
<td align="left">串口屏<strong>专用集成开发环境</strong></td>
<td align="left"><strong>通用Python IDE</strong></td>
</tr>
<tr>
<td align="left"><strong>界面设计</strong></td>
<td align="left"><strong>可视化拖拽</strong>，专有控件，所见即所得</td>
<td align="left">需借助 PyQt、Tkinter 等库<strong>编写代码</strong>来创建图形界面</td>
</tr>
<tr>
<td align="left"><strong>通信逻辑</strong></td>
<td align="left">内建串口通信协议，<strong>自动生成指令帧</strong></td>
<td align="left">需手动调用 <code>pyserial</code>等库<strong>编写底层串口通信代码</strong></td>
</tr>
<tr>
<td align="left"><strong>程序运行</strong></td>
<td align="left">代码最终<strong>下载到串口屏硬件</strong>中运行</td>
<td align="left">Python 代码在<strong>电脑</strong>上运行</td>
</tr>
<tr>
<td align="left"><strong>适用场景</strong></td>
<td align="left">专注于为嵌入式设备开发人机交互界面</td>
<td align="left">通用软件开发，如Web后端、数据分析、AI、脚本工具等</td>
</tr>
</tbody></table>
<figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs scss">实时时钟的缩写是<span class="hljs-built_in">RTC</span>(Real_Time Clock)。RTC 是集成电路，通常称为时钟芯片。<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">实时时钟芯片是日常生活中应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时，还可以工作，需要外加电池供电。<br></code></pre></td></tr></table></figure>

<p>配置文件常用的系统变量：</p>
<p><img src="http://blog.memory-life.xyz/image-20251124113840848.png" alt="image-20251124113840848"></p>
<p>请注意：page是跳转页面的指令，page指令后面的代码将不会执行。</p>
<p>Program.s 配置文件内容：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据</span><br><span class="hljs-type">int</span> sys0=<span class="hljs-number">0</span>,sys1=<span class="hljs-number">0</span>,sys2=<span class="hljs-number">0</span>     <span class="hljs-comment">//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现</span><br>baud=<span class="hljs-number">9600</span><span class="hljs-comment">//配置波特率</span><br>dim=<span class="hljs-number">100</span><span class="hljs-comment">//配置屏幕背光</span><br>recmod=<span class="hljs-number">0</span><span class="hljs-comment">//串口协议模式:0-字符串指令协议;1-主动解析协议</span><br>printh <span class="hljs-number">00</span> <span class="hljs-number">00</span> <span class="hljs-number">00</span> ff ff ff <span class="hljs-number">88</span> ff ff ff<span class="hljs-comment">//输出上电信息到串口</span><br>page <span class="hljs-number">0</span>                       <span class="hljs-comment">//上电刷新第0页</span><br></code></pre></td></tr></table></figure>

<p>下午再研究下代码编写吧，中午吃完饭顺便把串口屏带上，对照着官网引导看看这屏幕的构造啥的。</p>
<hr>
<p>午饭后。</p>
<p><strong>书写语法。</strong></p>
<p>滑块实现调节屏幕亮度：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">dim=h0.val<br></code></pre></td></tr></table></figure>

<p>按钮实现跳转至新的页面：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">dim=h0.val<br></code></pre></td></tr></table></figure>

<p>实现一个定时器：</p>
<figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs fortran">错误:全局变量定义必须放在<span class="hljs-keyword">Program</span>.c文件中所有代码之前:<span class="hljs-built_in">int</span> timer_count = <span class="hljs-number">0</span>(双击此处定位代码)<br>错误:编译失败<span class="hljs-comment">! 1个错误, 0个警告</span><br></code></pre></td></tr></table></figure>

<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据</span><br><span class="hljs-type">int</span> sys0=<span class="hljs-number">0</span>,sys1=<span class="hljs-number">0</span>,sys2=<span class="hljs-number">0</span>     <span class="hljs-comment">//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现</span><br><span class="hljs-type">int</span> timer_count = <span class="hljs-number">0</span>   <span class="hljs-comment">//定义定时器</span><br><br>baud=<span class="hljs-number">9600</span><span class="hljs-comment">//配置波特率</span><br>dim=<span class="hljs-number">100</span><span class="hljs-comment">//配置屏幕背光</span><br>recmod=<span class="hljs-number">0</span><span class="hljs-comment">//串口协议模式:0-字符串指令协议;1-主动解析协议</span><br><br>printh <span class="hljs-number">00</span> <span class="hljs-number">00</span> <span class="hljs-number">00</span> ff ff ff <span class="hljs-number">88</span> ff ff ff<span class="hljs-comment">//输出上电信息到串口</span><br>page <span class="hljs-number">0</span>                       <span class="hljs-comment">//上电刷新第0页</span><br></code></pre></td></tr></table></figure>

<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs c">timer_count++<br><span class="hljs-keyword">if</span>(timer_count==<span class="hljs-number">10</span>)<br>&#123;<br>  page main<br>&#125;<br></code></pre></td></tr></table></figure>

<p>这个编译器报错后的代码定位功能真不错。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">//给n0控件的val属性赋值123</span><br>n0.val=<span class="hljs-number">1</span><br><span class="hljs-comment">//把h0控件的val属性赋值给n0控件的val属性</span><br>n1.val=h0.val<br><span class="hljs-comment">//给系统变量dim赋值80（背光亮度立即变为80亮度）</span><br>dim=<span class="hljs-number">90</span><br><span class="hljs-comment">//给系统变量bauds赋值115200(屏幕波特率立即变为115200)</span><br>bauds=<span class="hljs-number">115200</span><br><span class="hljs-comment">//把屏幕当前的波特率系统变量赋值给n0控件的val属性</span><br>n2.val=bauds<br><span class="hljs-comment">// 如果有变量需要格式化显示</span><br><span class="hljs-comment">//t0.txt=&quot;数值=&quot;+n0.val</span><br><span class="hljs-comment">//设置p0控件显示id为2的图片</span><br>p0.pic=<span class="hljs-number">0</span><br><span class="hljs-comment">//设置p0控件显示id为n0.val的图片</span><br>p1.pic=n0.val<br></code></pre></td></tr></table></figure>

<p><strong>运算操作。</strong></p>
<figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs gcode">所有运算不支持乘除法优先，也不支持括号优先级，统一从左到右的顺序，请特别注意。<br>所有的运算操作可以在上位编辑状态下写入控件事件中，也可以串口传输过来<span class="hljs-comment">(串口传输记得加三个0xff的结束符)</span><br>所有的运算操作都不支持多余空格，添加进任何空格，编译都会报错<br></code></pre></td></tr></table></figure>

<p><strong>跨页面赋值，全局变量。</strong></p>
<p>多数情况下，我们都是在操作当面页面的控件属性，如果需要操作其他页面的控件属性需要提前将对应的控件设置为全局。</p>
<p>[页面].[控件].[属性]=XXX。</p>
<p><strong>逻辑语句。</strong></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs">所有的逻辑语句只能在上位编辑状态下写入控件的事件中，不支持串口传输逻辑语句。<br>所有的判断语句都不支持多余空格，添加进任何空格，编译都会报错<br></code></pre></td></tr></table></figure>

<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-keyword">if</span>(b0.txt==<span class="hljs-string">&quot;开始&quot;</span>)<br>&#123;<br>   b0.txt=<span class="hljs-string">&quot;停止&quot;</span><br>&#125;<span class="hljs-keyword">else</span><br>&#123;<br>   b0.txt=<span class="hljs-string">&quot;开始&quot;</span><br>&#125;<br></code></pre></td></tr></table></figure>

<p>n0.val一直自加到100为止，在自加过程中屏幕会一直不断的刷新n0控件的显示。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-keyword">while</span>(n0.val&lt;<span class="hljs-number">100</span>)<br>&#123;<br>  n0.val++<br>  doevents<br>&#125;<br></code></pre></td></tr></table></figure>

<p><strong>串口屏返回数据格式。</strong></p>
<p>取消设备开机固定发送开机信息，转为Program.s中由代码发送开机信息（用户可自行注释或者删除）。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs c">printh <span class="hljs-number">00</span> <span class="hljs-number">00</span> <span class="hljs-number">00</span> ff ff ff <span class="hljs-number">88</span> ff ff ff<span class="hljs-comment">//输出上电信息到串口</span><br>page <span class="hljs-number">0</span>                       <span class="hljs-comment">//上电刷新第0页</span><br></code></pre></td></tr></table></figure>

<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-number">00</span> <span class="hljs-number">00</span> <span class="hljs-number">00</span>     - 帧头或预留字段（可能是设备地址或命令类型）<br>ff ff ff     - 分隔符（USART HMI协议中常用<span class="hljs-number">0xFF</span>作为分隔）<br><span class="hljs-number">88</span>           - 核心数据：上电状态码（<span class="hljs-number">136</span>的十六进制）<br>ff ff ff     - 结束符（USART HMI协议要求每条指令以<span class="hljs-number">3</span>个<span class="hljs-number">0xFF</span>结束）<br></code></pre></td></tr></table></figure>

<p><strong>系统变量。</strong></p>
<p>在program.s中只能使用int来定义全局变量，无法定义char，float，double等类型，使用int定义的语句必须写在program.s的最前面</p>
<p>返回上一页。</p>
<p>某些情况下,可能从多个不同的页面跳转到同一个页面，这时如果在“返回”按钮中直接跳转到某一个页面，就会造成逻辑混乱，此时可以使用以下方法解决：</p>
<p>在program.s中新建一个lastpage变量。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">int</span> lastpage    <span class="hljs-comment">//定义上一页</span><br></code></pre></td></tr></table></figure>

<p>在每一个页面的离开事件中添加以下代码，将dp的值赋值给 lastpage 变量。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">lastpage=dp<br></code></pre></td></tr></table></figure>

<p>添加一个“返回上一页”按钮，在按钮中跳转到 lastpage 所保存的值。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">page lastpage<br></code></pre></td></tr></table></figure>

<p>刷新当前页面。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">page dp<br></code></pre></td></tr></table></figure>

<p>volume，体积;卷，合订本;容积，容量;量，额;音量，响度;大量，许多;书;（成套书籍中的）一卷，一册;最大音量;唱片;一套录音磁带。</p>
<p>背光亮度值。</p>
<figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs autoit"><span class="hljs-keyword">dim</span>和dims区别<br><span class="hljs-keyword">dim</span>：不会自动关机保存<br>dims：会自动保存，下次开机时还是此亮度值<br></code></pre></td></tr></table></figure>

<p>通过滑块设置亮度。</p>
<p>在前初始化事件中将dim赋值给进度条。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">h0.val=dim<br></code></pre></td></tr></table></figure>

<p>在滑动事件中将进度值赋值给dim。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">dim=h0.val<br></code></pre></td></tr></table></figure>

<p>在弹起事件中将进度值赋值给dims。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">dims=h0.val<br></code></pre></td></tr></table></figure>

<p>进度值的最小值建议设置为5，避免完全黑屏后没有办法调回来。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">min<br></code></pre></td></tr></table></figure>

<p>配置波特率值。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">baud=<span class="hljs-number">9600</span>	<span class="hljs-comment">//配置波特率</span><br></code></pre></td></tr></table></figure>

<p>无串口数据自动睡眠时间，无触摸操作自动睡眠时间。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs C"><span class="hljs-comment">//ussp=30 //30秒无串口数据自动进入睡眠模式</span><br>thsp=<span class="hljs-number">10</span> <span class="hljs-comment">//10秒无触摸操作自动进入睡眠模式</span><br></code></pre></td></tr></table></figure>

<p>睡眠。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs C">sleep=<span class="hljs-number">1</span><br></code></pre></td></tr></table></figure>

<p>随机数。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">//设置随机数取值范围0-9999</span><br>randset <span class="hljs-number">0</span>,<span class="hljs-number">9999</span><br>n0.val=rand<br>n1.val=rand<br>n2.val=rand<br>n3.val=rand<br>n4.val=rand<br><span class="hljs-comment">//n0,n1,n2,n3,n4大概率是5个毫不相干的值,当然由于概率的原因可能有重复的</span><br></code></pre></td></tr></table></figure>

<p>修改颜色。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs c">t0.txt=<span class="hljs-string">&quot;白色字体黑色背景&quot;</span><br>t1.txt=<span class="hljs-string">&quot;绿色字体红色背景&quot;</span><br>t0.pco=WHITE<span class="hljs-comment">//设置t0字体色为白色</span><br>t0.bco=BLACK<span class="hljs-comment">//设置t0背景色为黑色</span><br>t1.pco=GREEN<span class="hljs-comment">//设置t1字体色为绿色</span><br>t1.bco=RED<span class="hljs-comment">//设置t1背景色为红色</span><br></code></pre></td></tr></table></figure>

<p><strong>串口屏调试。</strong></p>
<p>淘晶驰串口屏的模拟器功能非常强大,您可以在没有串口屏实物的情况下通过模拟器进行调试，上位机模拟器几乎可以完全模拟真实的设备，在指令输入区可以直接输入指令，不需要结束符。</p>
<p>在指令输入区可输入指令给文本赋值，不需要对引号进行转义。</p>
<p>跳转页面，给文本/数字赋值，设置屏幕背光。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs c">page page1<br>n0.val=<span class="hljs-number">10000</span><br>dim=<span class="hljs-number">90</span><br></code></pre></td></tr></table></figure>

<p>也可以修改文本控件的背景颜色,可以通过指令修改的是控件的“绿色属性”。</p>
<p>调整控件大小。</p>
<p>t0.txt=”淘晶驰电子”和t0.bco=YELLOW的区别是一个加了引号,一个没有加引号,这是因为txt是字符串,bco则是整形,目前只txt,path,dir,filter是字符串,其他均为整形。</p>
<p><strong>黑色属性和绿色属性。</strong></p>
<p>如下图所示：属性栏中显示为绿色的属性都可以在运行中修改，黑色的属性只能在编辑时修改，不能在运行中修改。</p>
<p><strong>USB转TTL的接线说明。</strong></p>
<figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs armasm">串口屏的TX（发送）接USB转<span class="hljs-meta">TTL</span>的RX（接收）<br><br>串口屏的RX（接收）接USB转<span class="hljs-meta">TTL</span>的TX（发送）<br><br>串口屏的GND要和USB转<span class="hljs-meta">TTL</span>的GND连接在一起（共地）<br><br>如果上电时发现串口屏不断重启（<span class="hljs-number">4</span>.<span class="hljs-number">3</span>寸以上的屏幕以及带喇叭的屏幕），可能是供电不足，这时候需要并联一个电源来提高电流<br><br>需要额外找一个电源引出电源正负极，注意正负极之间的电压应该在屏幕的供电范围内<br><br>将电源正极接到屏幕的VCC上（请注意电压范围）<br><br>电源负极接到GND（共地）<br><br>这样就实现了对屏幕的额外供电<br></code></pre></td></tr></table></figure>

<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">单片机，串口屏，这些东西有什么关联呢？<br></code></pre></td></tr></table></figure>

<p>单片机和串口屏的关系就像是 <strong>“大脑”</strong> 和 <strong>“脸”</strong> 的关系。</p>
<ul>
<li><strong>单片机</strong> 是<strong>大脑</strong>：负责核心的逻辑计算、数据处理、控制决策。</li>
<li><strong>串口屏</strong> 是<strong>脸</strong>：负责信息显示和人机交互（触摸），并把用户的指令反馈给大脑。</li>
</ul>
<p>它们各司其职，共同构成一个完整的嵌入式人机交互系统。下面这个表格清晰地展示了两者的分工与合作。</p>
<table>
<thead>
<tr>
<th align="left">模块</th>
<th align="left">角色</th>
<th align="left">核心任务</th>
<th align="left">相当于</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>单片机</strong></td>
<td align="left"><strong>大脑/主控</strong></td>
<td align="left">执行核心逻辑、运算、控制外设、与传感器/执行器通信</td>
<td align="left">汽车的发动机、ECU</td>
</tr>
<tr>
<td align="left"><strong>串口屏</strong></td>
<td align="left"><strong>脸/交互界面</strong></td>
<td align="left">显示图形界面、接收触摸指令、将指令转发给单片机</td>
<td align="left">汽车的仪表盘、方向盘、中控屏</td>
</tr>
</tbody></table>
<p>这种设计带来的优势：</p>
<table>
<thead>
<tr>
<th align="left">优势</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>降低开发难度</strong></td>
<td align="left">单片机程序员无需编写复杂的图形驱动和触摸识别代码，只需通过简单的串口指令即可控制精美界面。</td>
</tr>
<tr>
<td align="left"><strong>专业分工</strong></td>
<td align="left">硬件工程师专注于单片机功能，UI设计师专注于屏幕界面设计，两者通过串口协议对接，协作高效。</td>
</tr>
<tr>
<td align="left"><strong>灵活更换</strong></td>
<td align="left">只要通信协议不变，可以轻易更换不同尺寸、不同厂家的串口屏，而无需修改单片机的主程序。</td>
</tr>
</tbody></table>
<p>通俗地解释单片机开发：</p>
<table>
<thead>
<tr>
<th align="left">Web开发</th>
<th align="left">单片机开发</th>
<th align="left">思维转换</th>
</tr>
</thead>
<tbody><tr>
<td align="left">处理<strong>数据</strong></td>
<td align="left">控制<strong>电流</strong></td>
<td align="left">你写的代码会直接影响物理世界的电压和电流。</td>
</tr>
<tr>
<td align="left">逻辑错误导致<strong>页面报错</strong></td>
<td align="left">逻辑错误可能导致<strong>短路、冒烟</strong></td>
<td align="left">对硬件要心存敬畏，连接电路前务必检查！</td>
</tr>
<tr>
<td align="left">崩溃了可以<strong>刷新页面</strong></td>
<td align="left">代码写死可能导致芯片<strong>“变砖”</strong></td>
<td align="left">需要掌握如何通过“烧录器”来救援。</td>
</tr>
</tbody></table>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">串口屏开发需要用到 USART HMI 编辑器，那么单片机开发呢，常用的编辑器有哪些？<br></code></pre></td></tr></table></figure>

<p>什么是单片机？</p>
<p>什么是嵌入式开发？</p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/connect_ttl.html">和USB转TTL的接线说明 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/connect_mcu.html">和单片机的接线说明 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs asciidoc"><span class="hljs-bullet">- </span>模拟器(电脑)与串口屏实物连接<br><span class="hljs-bullet">- </span>模拟器(电脑)与单片机连接<br><span class="hljs-bullet">- </span>串口屏与单片机连接<br></code></pre></td></tr></table></figure>

<p>任意两个设备之间连接，均是TX接对方的RX，RX接对方的TX，GND接对方的GND，如果双方都有独立的供电，可以不接5V线</p>
<p><strong>电脑与串口屏连接。</strong></p>
<ol>
<li>必须保证下面选择的是“键盘输入”，上面才能选择模拟器和串口，与串口屏进行联机。</li>
<li>当模拟器和一个串口屏实物连接成功时，底部将会显示联机成功,以及联机获取到的串口屏参数。</li>
<li>此时输入指令，指令会被同时发送到模拟器和串口屏实物上</li>
<li>除此之外,如果屏幕是带RTC的(例如X5/K0系列),可以校准RTC(必须是在联机成功的状态下)，校准前请安装串口屏实物背部的RTC电池,型号是CR1220</li>
</ol>
<figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gcode">淘晶驰强大的模拟器功能几乎能够实现与实体屏幕几乎一样的功能，除外部IO，电阻屏校准等实物特有的少数功能外，几乎都可以在屏幕上完全仿真。您可以提前通过<span class="hljs-comment">(电脑上的)</span>模拟器和单片机之间进行通讯，在屏幕样品快递之前就能完成大部分功能的开发和调试，大大降低开发和选型成本。<br></code></pre></td></tr></table></figure>

<p><strong>电脑与单片机连接。</strong></p>
<p>这个连接方式在这里不再详述。</p>
<p><strong>单片机与串口屏连接。</strong></p>
<p>淘晶驰官方的USB转TTL转接板，其作用有以下两种：</p>
<p>1、电脑通过USB转TTL连接串口屏进行下载或者调试。</p>
<p>2、电脑通过USB转TTL连接单片机进行通讯。</p>
<p>如果不使用电脑时，请勿通过USB转TTL工具连接单片机和串口屏，怎么接都不行！</p>
<p>部分客户使用的是正点原子、野火等公司的开发板，看到板子上有USB口，就直接把USB转TTL工具插上去。</p>
<p>或者是开发板有microUSB接口或者typec接口，把自己的手机充电线插进去，这是万万不行的。</p>
<p>因为这时候你的单片机开发板是接入了一个USB设备而不是USART设备，除非你去驱动这个USB外设先与这个USB转TTL进行通讯，否则是不能跟屏幕进行通讯的。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">USART</span>（Universal Synchronous/Asynchronous Receiver/Transmitter）是一种全双工通用同步/异步串行收发模块，作为高度灵活的串行通信设备，支持相互独立的收发数据操作。其核心功能涵盖同步/异步双模式运行，可配置<span class="hljs-number">5</span>至<span class="hljs-number">9</span>位数据位及<span class="hljs-number">1</span>-<span class="hljs-number">2</span>位停止位，内置硬件奇偶校验、数据溢出检测、帧错误检测等机制，并具备三级中断支持。<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">模块结构包含时钟发生器、数据发送器与接收器三大组件，其中时钟发生器由同步逻辑电路和波特率发生器组成，发送器采用缓冲器实现连续传输，接收器则集成两级缓冲器和噪声滤波器。USART与UART保持寄存器位定义、波特率生成等基础兼容性，同时在接收缓冲器设计和错误标志处理方面有所改进。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/base/tjc2mcu.html">串口屏与单片机连接 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p>所有单片机与串口屏连接的注意事项，直接点击上文的官网链接查看即可。</p>
<p><strong>串口屏通信协议。</strong></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/usart_protocol/index.html">串口屏通讯协议 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p>这方面稍后再做了解。</p>
<p>其他联调方案暂且放过，重点可以看看与 Python 之间的联调。</p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/python/index.html">与python联调 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<p><a target="_blank" rel="noopener" href="http://wiki.tjc1688.com/debug/python/python1.html">python发送数据给屏幕 — 淘晶驰串口屏资料中心 1.1.0-2025-11-21 14:36:46 文档</a></p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/706005761">(99+ 封私信 / 82 条消息) 「笔记分享」迪文串口屏基础GUI开发流程 - 知乎</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_49476241/article/details/145661148">串口屏介绍及开发环境搭建-CSDN博客</a></p>
<blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1760941491068072336&wfr=spider&for=pc">什么是串口屏？串口屏该怎么选？</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_49476241/article/details/145661148">串口屏介绍及开发环境搭建-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/2301_82191680/article/details/150954411">串口屏入门-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_42190402/article/details/142986199">迪文串口屏例程-CSDN博客</a></p>
<p>[<a target="_blank" rel="noopener" href="https://blog.csdn.net/jiangge12/article/details/123668138"> Arduino+Python ] 做一个串口屏，显示CPU使用率_python做硬件显示屏-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Horizonhui/article/details/78291844">Python串口调试-CSDN博客</a></p>
<p>Python 读取串口并在终端显示，界面虽然不好看，但是有时候可以用来调试程序。</p>
<h2 id="右键菜单"><a href="#右键菜单" class="headerlink" title="右键菜单"></a>右键菜单</h2><blockquote>
<p>2025 年 11 月 20 日</p>
</blockquote>
<p>更新下注册表中 <code>command</code> 的参数配置</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl"><span class="hljs-string">&quot;D:\dev\Visual Studio Code\Microsoft VS Code\Code.exe&quot;</span> <span class="hljs-string">&quot;%1&quot;</span><br></code></pre></td></tr></table></figure>

<p>在注册表命令中添加正确的参数后，成功让 <code>VSCode</code> 基于选定的文件夹打开，其他所有程序的参数配置类似。</p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p><img src="http://blog.memory-life.xyz/image-20251118100536190.png" alt="image-20251118100536190"></p>
<ol>
<li><strong>在以下关键路径下逐一查找</strong>：<strong>路径1：文件/文件夹通用菜单</strong><code>计算机\HKEY_CLASSES_ROOT*\shell``计算机\HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers</code><strong>路径2：文件夹背景菜单（最可能的位置）</strong><code>计算机\HKEY_CLASSES_ROOT\Directory\Background\shell``计算机\HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers</code><strong>路径3：驱动器菜单</strong><code>计算机\HKEY_CLASSES_ROOT\Drive\shell``计算机\HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers</code></li>
<li><strong>搜索方法</strong>：逐个展开上述路径。例如，展开 <code>Directory\Background\shell</code>，您会看到很多子项。</li>
</ol>
<p>搜狗的 <code>彻底粉碎文件</code> 和 <code>清理大文件/重复文件</code> 两个篡改右键菜单项，我在这两个目录下成功删除了：</p>
<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica">计算机\<span class="hljs-type">HKEY_CLASSES</span><span class="hljs-type">_ROOT</span>\<span class="hljs-built_in">Directory</span>\<span class="hljs-built_in">Background</span>\<span class="hljs-variable">shellex</span>\<span class="hljs-variable">ContextMenuHandlers</span><br></code></pre></td></tr></table></figure>

<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript">计算机\HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers<br></code></pre></td></tr></table></figure>

<p>夸克云盘也一样。</p>
<hr>
<figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs subunit">注册表里有这些数据是什么意思啊：&#123;A470F8CF-A1E8<span class="hljs-string">-4</span>f65<span class="hljs-string">-8335</span><span class="hljs-string">-227475</span>AA5C46&#125;<br></code></pre></td></tr></table></figure>

<ol>
<li>这个 GUID 在哪里？</li>
</ol>
<p>根据我们之前的对话上下文，您很可能是在以下路径中找到它的：</p>
<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-type">HKEY_CLASSES</span><span class="hljs-type">_ROOT</span>\<span class="hljs-built_in">Directory</span>\<span class="hljs-built_in">Background</span>\<span class="hljs-variable">shellex</span>\<span class="hljs-variable">ContextMenuHandlers</span><br></code></pre></td></tr></table></figure>

<p>在这个路径下，您会看到一个或多个以 GUID 命名的子项。您截图中编辑的，正是某个此类子项下的 <code>(默认)</code>值。</p>
<ol start="2">
<li>这个结构是什么意思？</li>
</ol>
<p>这种结构代表右键菜单的<strong>一种注册方式</strong>：</p>
<ul>
<li><strong>方式A：简单菜单（我们之前讨论的）</strong>路径：<code>...\shell\某个名称</code>特点：直接在 <code>(默认)</code>值里填写要显示的文字（如“上传到夸克网盘”），并在其下建立 <code>command</code>子项来指定要运行的程序。<strong>这种是直接、简单的命令。</strong></li>
<li><strong>方式B：复杂菜单（您截图中的方式）</strong>路径：<code>...\shellex\ContextMenuHandlers\某个GUID</code>特点：<code>(默认)</code>值里不填菜单文字，而是填一个 GUID。<strong>这种是告诉系统：“去调用这个编号的组件来生成菜单”。</strong>优点：功能强大，可以实现动态菜单（如“使用Notepad++打开”的子菜单）、图标、条件判断等复杂逻辑。</li>
</ul>
<ol start="3">
<li>这个特定的 GUID 是什么？</li>
</ol>
<p>您截图中的 GUID <code>&#123;85212cfd-77ed-4add-8e24-a0a39e3dbfc3&#125;</code>经过查询，是 <strong>Microsoft 自家组件</strong> 的标识符，通常与 <strong>“设置”或“个性化”</strong> 等相关。它很可能是系统自带的某个右键菜单项（例如在新版Windows中，桌面右键菜单里的“显示设置”或“个性化”）。</p>
<p><strong>这很重要，因为它意味着这个菜单项大概率是系统核心功能，而不是您想删除的第三方软件（如搜狗捆绑的软件）添加的。</strong></p>
<hr>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">YunShellExt</span><br></code></pre></td></tr></table></figure>

<p>在这个目录下有这个注册表文件：</p>
<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript">计算机\HKEY_CLASSES_ROOT\Directory\shell\YunShellExplorerCommand<br></code></pre></td></tr></table></figure>

<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript">计算机\HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\SendTo<br></code></pre></td></tr></table></figure>

<figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs asciidoc">计算机\HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\YunShellExt<br></code></pre></td></tr></table></figure>

<p>依次删除以上目录，我把第三条注册表目录删除以后，<strong>右键点击文件</strong>后百度网盘的菜单项竟然消失了。</p>
<figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs asciidoc">计算机\HKEY_CLASSES_ROOT\*\shell\YunShellExplorerCommand<br></code></pre></td></tr></table></figure>

<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript">计算机\HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\YunShellExt<br></code></pre></td></tr></table></figure>

<p>依次删除以上目录，我把第而二条注册表目录删除以后，<strong>右键点击文件夹</strong>后百度网盘的菜单项也消失了。</p>
<p>清爽。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_62064241/article/details/124973189">windows10系统下以管理员身份进入CMD（命令提示符）的三种方法_管理员身份win 10进入命令方法-CSDN博客</a></p>
<ol>
<li>搜索栏直接搜索：点击任务栏上的「搜索框」（Win10 在左侧，Win11 在中间），输入 “cmd” 或 “命令提示符”，搜索结果中会显示 “命令提示符”，点击即可打开（若需管理员权限，右键选择 “以管理员身份运行”）；</li>
<li>开始菜单查找：点击桌面左下角「开始菜单」（Win 图标），Win10 在 “Windows 系统” 文件夹中找到 “命令提示符”，Win11 需展开 “所有应用”，在字母 “W” 分类下的 “Windows 工具” 里找到 “命令提示符”，点击打开；</li>
<li>快捷键 “Win+R” 调用：按下键盘上的 “Win 键 + R 键”（Win 键即带 Windows 图标的按键），弹出 “运行” 对话框，输入 “cmd”，点击 “确定” 或按回车，即可快速打开命令提示符（若需管理员权限，在 “运行” 对话框中输入 “cmd” 后，按住 “Ctrl+Shift + 回车”）。</li>
</ol>
<blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<p>自今年夏天七月初格式化C盘之后，之前自定义过的开始菜单磁铁、系统环境变量以及右键菜单都被重置了，给日常使用添了不少麻烦。</p>
<p>今早花时间搞搞这个。</p>
<p>夸克网盘，右键文件夹篡改的注册表目录在这里：</p>
<figure class="highlight nsis"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nsis">计算机\<span class="hljs-params">HKEY_CLASSES_ROOT</span>\<span class="hljs-literal">Directory</span>\shell<br></code></pre></td></tr></table></figure>

<p>这是任意空白处点击右键的注册表目录：</p>
<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica">计算机\<span class="hljs-type">HKEY_CLASSES</span><span class="hljs-type">_ROOT</span>\<span class="hljs-built_in">Directory</span>\<span class="hljs-built_in">Background</span><br></code></pre></td></tr></table></figure>

<p>针对所有文件夹的：<code>计算机\HKEY_CLASSES_ROOT\Directory\shell</code>。</p>
<p>针对空白处的：<code>计算机\HKEY_CLASSES_ROOT\Directory\Background\shell</code>。</p>
<p>针对所有文件（包括文件夹）的：<code>计算机\HKEY_CLASSES_ROOT\AllFilesystemObjects\shell</code>。</p>
<p>以上是系统用户的，部分配置也可能在当前用户下：<code>计算机\HKEY_CURRENT_USER\Software\Classes\Directory\shell</code></p>
<p>百度网盘，夸克云盘，搜狗，这三个注册表菜单都是自定义的吗，放在<code>计算机\HKEY_CLASSES_ROOT</code>目录下的话就不好找了。</p>
<p>还是先考虑添加任意空白处的注册表策略吧。</p>
<p>主要是常用的编译器。</p>
<h2 id="PING"><a href="#PING" class="headerlink" title="PING"></a>PING</h2><blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs 1c"><span class="hljs-string">&quot;C:\Windows\System32\PING.EXE&quot;</span><br></code></pre></td></tr></table></figure>

<p>系统环境变量里新增如下一条即可：</p>
<figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs avrasm"><span class="hljs-symbol">C:</span>\Windows\System32\<br></code></pre></td></tr></table></figure>

<h2 id="云盘"><a href="#云盘" class="headerlink" title="云盘"></a>云盘</h2><blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<p>查看一下D盘磁盘空间，妈的都爆红了，D盘磁盘空间一共<strong>275GB</strong>现在就剩19G多了，不知道给我电脑里装了些什么玩意儿。</p>
<p>sofware 占用空间大小17GB，blog 占用空间大小3.5GB，dev 占用空间大小70GB，project 占用空间55GB，program 占用空间ji5GB。</p>
<p>四个主要文件夹一共占用空间<strong>150.5GB</strong>。</p>
<p>隐藏文件夹里，视频占用空间14.6GB，图片占用空间32.3GB，文档占用空间29GB，桌面将近2GB。</p>
<p>这些都是占大头的，一共占用空间<strong>77.9GB</strong>。</p>
<h2 id="CI-CD"><a href="#CI-CD" class="headerlink" title="CI/CD"></a>CI/CD</h2><blockquote>
<p>2025 年 11 月 13 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7545725771357831194">我一个写Java的，怎么就开始玩K8s和Jenkins了？！前几天接到一个新任务，要求把以前部署在私有服务器上的项目，全 - 掘金</a></p>
<h2 id="Jasypt"><a href="#Jasypt" class="headerlink" title="Jasypt"></a>Jasypt</h2><blockquote>
<p>2025 年 11 月 12 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/brrdg_sefg/article/details/146045562">JAVA集成Jasypt进行加密、解密(SpringBoot)_jasypt在线加密解密工具-CSDN博客</a></p>
<p><strong>集成步骤总结：</strong></p>
<p>引入 Jasypt 依赖。</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>com.github.ulisesbocchio<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jasypt-spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>3.0.4<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-comment">&lt;!-- 请根据需要更新到最新版本 --&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span><br></code></pre></td></tr></table></figure>

<p>配置加密密钥。</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">jasypt:</span><br>	<span class="hljs-attr">encryptor:</span><br>		<span class="hljs-attr">password:</span> <span class="hljs-string">mysecretkey</span><br></code></pre></td></tr></table></figure>

<p>对敏感数据进行加密，并在配置文件中使用 <code>ENC()</code> 包裹加密值。</p>
<p>使用 Jasypt 命令行工具加密，Jasypt 提供了命令行工具来加密数据，执行以下命令加密数据库密码：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">java -<span class="hljs-built_in">cp</span> jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=<span class="hljs-string">&quot;your_password&quot;</span> password=<span class="hljs-string">&quot;mysecretkey&quot;</span> algorithm=PBEWithMD5AndDES<br></code></pre></td></tr></table></figure>

<p>其中：</p>
<ol>
<li>input 是要加密的文本（例如数据库密码）</li>
<li>password 是加密密钥（与我们在配置文件中设置的 mysecretkey 一致）</li>
<li>algorithm 是加密算法，这里使用 PBEWithMD5AndDES。</li>
</ol>
<p>执行后，将得到类似以下的加密文本输出：</p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">5MG1sSxAx+<span class="hljs-attribute">EeJsBdmcVdKg</span>==<br></code></pre></td></tr></table></figure>

<p>将加密后的文件写入配置文件：</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">spring:</span><br>	<span class="hljs-attr">datasource:</span><br>		<span class="hljs-attr">password:</span> <span class="hljs-string">ENC(5MG1sSxAx+EeJsBdmcVdKg==)</span><br></code></pre></td></tr></table></figure>

<p>当 Spring Boot 项目启动时，Jasypt 会自动识别 <code>ENC()</code> 包裹的加密内容，并使用密钥进行解密，无需额外的代码逻辑。这意味着在运行时，应用能够使用解密后的值。</p>
<p>可根据需求自定义加密器，选择适合的加密算法和配置。</p>
<h2 id="分支"><a href="#分支" class="headerlink" title="分支"></a>分支</h2><blockquote>
<p>2025 年 11 月 11 日</p>
</blockquote>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">Merge</span> incoming changes <span class="hljs-keyword">into</span> the <span class="hljs-keyword">current</span> branch<br></code></pre></td></tr></table></figure>

<figure class="highlight nsis"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nsis">Rebase the <span class="hljs-literal">current</span> branch <span class="hljs-literal">on</span> <span class="hljs-literal">top</span> of incoming changes<br></code></pre></td></tr></table></figure>

<p>在更新分支时，选择“Merge incoming changes”还是“Rebase the current branch”会带来截然不同的项目历史记录。为了帮你快速把握核心区别，下面这个表格汇总了它们的主要特性。</p>
<table>
<thead>
<tr>
<th align="left">特性</th>
<th align="left">Merge (合并)</th>
<th align="left">Rebase (变基)</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>历史记录结构</strong></td>
<td align="left">保留分叉与合并点，形成图状结构</td>
<td align="left">生成线性历史记录，隐藏分叉</td>
</tr>
<tr>
<td align="left"><strong>操作原理</strong></td>
<td align="left">创建一个新的<strong>合并提交</strong>，将两个分支的历史联系在一起</td>
<td align="left">将当前分支的提交“移动”到目标分支的最新提交之后</td>
</tr>
<tr>
<td align="left"><strong>提交哈希值</strong></td>
<td align="left">原有提交的哈希值不变</td>
<td align="left">被移动的提交会生成<strong>全新的哈希值</strong></td>
</tr>
<tr>
<td align="left"><strong>适用分支</strong></td>
<td align="left"><strong>公共分支</strong>（如main、develop）</td>
<td align="left"><strong>本地分支</strong>或未推送的分支</td>
</tr>
<tr>
<td align="left"><strong>冲突处理</strong></td>
<td align="left">在合并提交时<strong>一次性解决</strong>所有冲突</td>
<td align="left">在“移动”每个提交时都可能遇到冲突，需<strong>逐个解决</strong></td>
</tr>
</tbody></table>
<p>用 Rebase 来清理本地历史，用 Merge 来将工作成果集成到公共代码库。</p>
<h2 id="安装部署"><a href="#安装部署" class="headerlink" title="安装部署"></a>安装部署</h2><blockquote>
<p>2025 年 11 月 10 日</p>
</blockquote>
<p>下午锦浩给我拿U盘提供了几份安装部署文档。</p>
<p><img src="http://blog.memory-life.xyz/image-20251110174823921.png" alt="image-20251110174823921"></p>
<p>DBeaver（数据库管理工具），FileZilla（FTP/SFTP文件传输工具）， MobaXterm（全能终端工具）， Notepad++（代码编辑器），oCam（屏幕录制软件），Postman（API测试工具），Xshell（SSH终端客户端）。</p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">公司加班是有补贴的，平时<span class="hljs-number">20</span>元<span class="hljs-regexp">/小时，周末30元/</span>小时，下班了可以在公司继续学习，提升专业能力，进而涨工资，这才是提高收入的正道。<br></code></pre></td></tr></table></figure>

<p>JDK 安装配置。</p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">[admin@localhost ~]$ <span class="hljs-keyword">java </span>-version<br>openjdk version <span class="hljs-string">&quot;1.8.0_131&quot;</span><br>OpenJDK Runtime Environment (<span class="hljs-keyword">build </span><span class="hljs-number">1</span>.<span class="hljs-number">8</span>.<span class="hljs-number">0</span>_131-<span class="hljs-keyword">b12)</span><br><span class="hljs-keyword"></span>OpenJDK <span class="hljs-number">64</span>-<span class="hljs-keyword">Bit </span>Server VM (<span class="hljs-keyword">build </span><span class="hljs-number">25</span>.<span class="hljs-number">131</span>-<span class="hljs-keyword">b12, </span>mixed mode)<br></code></pre></td></tr></table></figure>

<p>Docker 安装配置。</p>
<p>查看 Docker 版本。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker --version<br></code></pre></td></tr></table></figure>

<p>查看 CentOS 虚拟机版本，经尝试后执行以下<strong>五个命令</strong>任意一个都可以。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> /etc/centos-release<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[admin@localhost ~]$ <span class="hljs-built_in">cat</span> /etc/centos-release<br>CentOS Linux release 7.4.1708 (Core) <br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> /etc/os-release<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs bash">[admin@localhost ~]$ <span class="hljs-built_in">cat</span> /etc/os-release<br>NAME=<span class="hljs-string">&quot;CentOS Linux&quot;</span><br>VERSION=<span class="hljs-string">&quot;7 (Core)&quot;</span><br>ID=<span class="hljs-string">&quot;centos&quot;</span><br>ID_LIKE=<span class="hljs-string">&quot;rhel fedora&quot;</span><br>VERSION_ID=<span class="hljs-string">&quot;7&quot;</span><br>PRETTY_NAME=<span class="hljs-string">&quot;CentOS Linux 7 (Core)&quot;</span><br>ANSI_COLOR=<span class="hljs-string">&quot;0;31&quot;</span><br>CPE_NAME=<span class="hljs-string">&quot;cpe:/o:centos:centos:7&quot;</span><br>HOME_URL=<span class="hljs-string">&quot;https://www.centos.org/&quot;</span><br>BUG_REPORT_URL=<span class="hljs-string">&quot;https://bugs.centos.org/&quot;</span><br><br>CENTOS_MANTISBT_PROJECT=<span class="hljs-string">&quot;CentOS-7&quot;</span><br>CENTOS_MANTISBT_PROJECT_VERSION=<span class="hljs-string">&quot;7&quot;</span><br>REDHAT_SUPPORT_PRODUCT=<span class="hljs-string">&quot;centos&quot;</span><br>REDHAT_SUPPORT_PRODUCT_VERSION=<span class="hljs-string">&quot;7&quot;</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">rpm -q centos-release<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">centos-release-7-4.1708.el7.centos.x86_64<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">uname</span> -r<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[admin@localhost ~]$ <span class="hljs-built_in">uname</span> -r<br>3.10.0-693.el7.x86_64<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> /etc/redhat-release<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[admin@localhost ~]$ <span class="hljs-built_in">cat</span> /etc/redhat-release<br>CentOS Linux release 7.4.1708 (Core) <br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251110182901580.png" alt="image-20251110182901580"></p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">arm64</span>文件夹里也有个 docker 安装包，docker-<span class="hljs-number">24</span>.<span class="hljs-number">0</span>.<span class="hljs-number">6</span>.tgz，这与 docker-<span class="hljs-number">20</span>.<span class="hljs-number">10</span>.<span class="hljs-number">24</span>.tgz 有什么区别呢，我的 CentOS7 应该安装哪个？<br></code></pre></td></tr></table></figure>

<p>对于 <strong>CentOS 7</strong> 系统，您<strong>应该安装 <code>docker-20.10.24.tgz</code>这个版本</strong>。</p>
<p>不建议尝试安装 <code>arm64</code>文件夹下的 <code>docker-24.0.6.tgz</code>，主要原因有两个，其中第一个是致命错误：</p>
<ol>
<li><strong>架构不兼容（最关键原因）</strong>：<code>arm64</code>文件夹下的安装包是专门为 <strong>ARM 架构</strong>的CPU（例如苹果M系列芯片、某些国产化平台、树莓派等）编译的。而您的CentOS 7系统几乎可以肯定是在 <strong>x86_64（即AMD64）架构</strong>的服务器上运行的。强行安装会导致程序根本无法执行。</li>
<li><strong>版本兼容性</strong>：即使架构匹配，Docker 24.x 这样的新版本对旧操作系统的支持也可能不佳，容易遇到依赖库版本等问题。</li>
</ol>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7106484991483183118?searchId=202511101834583DDBEC6B3652F3010033">Linux安装Docker详细教程！ 本文已参与「新人创作礼」活动，一起开启掘金创作之路。 前置条件 前置知识 1、 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7424338056918777882?searchId=202511101834583DDBEC6B3652F3010033#heading-7">Docker 万字入门教程Docker 使用 Google 公司推出的 Go 语言进行开发实现，对进程进行封装隔离，属于 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7390337091077406729?searchId=202511101834583DDBEC6B3652F3010033#heading-4">Centos安装Docker的详细安装步骤，Docker相关组件：docker-ce-cli、docker-ce和containerd.io的区别 - 掘金</a></p>
<p>1、<strong>使用官方便捷脚本安装（最快速，适用于测试）</strong></p>
<figure class="highlight dsconfig"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs dsconfig"><span class="hljs-comment"># 下载安装脚本</span><br><span class="hljs-string">curl</span> -<span class="hljs-string">fsSL</span> <span class="hljs-string">https</span>://<span class="hljs-string">get</span>.<span class="hljs-string">docker</span>.<span class="hljs-string">com</span> -<span class="hljs-string">o</span> <span class="hljs-built_in">get-docker.sh</span><br><br><span class="hljs-comment"># 运行脚本（使用root权限）</span><br><span class="hljs-string">sudo</span> <span class="hljs-string">sh</span> <span class="hljs-built_in">get-docker.sh</span><br><br><span class="hljs-comment"># 或者，如果希望安装特定版本而不是最新版，可以设置版本变量</span><br><span class="hljs-comment"># export VERSION=20.10.24</span><br><span class="hljs-comment"># sudo sh get-docker.sh</span><br></code></pre></td></tr></table></figure>

<p>2、<strong>配置 yum 源在线安装（最有网络环境下的首选）</strong>，详见卓越之旅栏目下的详细安装过程。</p>
<p>3、<strong>使用现有的 <code>.tgz</code>压缩包安装（离线/内网环境首选）</strong></p>
<p>将 docker 安装包 docker-20.10.24.tgz 上传到服务器上</p>
<p>解压，执行以下命令：</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">tar</span> -zxvf docker-<span class="hljs-number">20</span>.<span class="hljs-number">10</span>.<span class="hljs-number">24</span>.tgz<br></code></pre></td></tr></table></figure>

<p>复制，执行以下命令：</p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">cp docker<span class="hljs-regexp">/* /u</span>sr<span class="hljs-regexp">/bin/</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs bash">[admin@localhost ~]$ <span class="hljs-built_in">cp</span> docker/* /usr/bin/<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/containerd&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/containerd-shim&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/containerd-shim-runc-v2&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/ctr&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/docker&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/dockerd&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/docker-init&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/docker-proxy&quot;</span>: 权限不够<br><span class="hljs-built_in">cp</span>: 无法创建普通文件<span class="hljs-string">&quot;/usr/bin/runc&quot;</span>: 权限不够<br>[admin@localhost ~]$ sudo <span class="hljs-built_in">cp</span> docker/* /usr/bin/<br><br>我们信任您已经从系统管理员那里了解了日常注意事项。<br>总结起来无外乎这三点：<br><br>    <span class="hljs-comment">#1) 尊重别人的隐私。</span><br>    <span class="hljs-comment">#2) 输入前要先考虑(后果和风险)。</span><br>    <span class="hljs-comment">#3) 权力越大，责任越大。</span><br><br>[sudo] admin 的密码：<br>admin 不在 sudoers 文件中。此事将被报告。<br><br></code></pre></td></tr></table></figure>

<p>切换到 root 用户即可避免。</p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">su</span> -<br><span class="hljs-comment"># 输入root用户的密码</span><br></code></pre></td></tr></table></figure>

<p>上传 docker.service，上传 docker.service 到 /etc/systemd/system。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cp</span> docker.service /etc/systemd/system<br></code></pre></td></tr></table></figure>

<p>授权，执行以下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> +x /etc/systemd/system/docker.service<br></code></pre></td></tr></table></figure>

<p>重新加载，执行以下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">systemctl daemon-reload<br></code></pre></td></tr></table></figure>

<p>配置开机启动，执行以下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">systemctl <span class="hljs-built_in">enable</span> docker<br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">[root@localhost system]<span class="hljs-comment"># systemctl enable docker</span><br>Created symlink from <span class="hljs-regexp">/etc/</span>systemd<span class="hljs-regexp">/system/mu</span>lti-user.target.wants<span class="hljs-regexp">/docker.service to /</span>etc<span class="hljs-regexp">/systemd/</span>system/docker.service.<br></code></pre></td></tr></table></figure>

<p>启动，执行以下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">systemctl start docker<br></code></pre></td></tr></table></figure>

<p>安装成功，查看 Docker 版本。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker version<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker --version<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost system]<span class="hljs-comment"># docker --version</span><br>Docker version 20.10.24, build 297e128<br></code></pre></td></tr></table></figure>

<p><strong>MySQL 安装配置。</strong></p>
<p>SELinux 关闭，查看SELinux 是否开启：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">getenforce<br></code></pre></td></tr></table></figure>

<p>关闭当前会话的 SELinux ，重启之后无效：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">setenforce 0<br></code></pre></td></tr></table></figure>

<p>永久关闭 SELinux ，需要重启：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sed -i <span class="hljs-string">&#x27;s/enforcing/disabled/&#x27;</span> /etc/selinux/config<br></code></pre></td></tr></table></figure>

<p>上传安装包，将 mysql 安装包 mysql-8.0.30.tar 上传到服务器上。</p>
<p>加载 mysql 镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt;mysql-8.0.30.tar<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker load &lt;mysql-8.0.30.tar</span><br>553b196ea5e8: Loading layer [==================================================&gt;]  106.8MB/106.8MB<br>7b1b5089c4c8: Loading layer [==================================================&gt;]  11.26kB/11.26kB<br>3bf157422b00: Loading layer [==================================================&gt;]  2.293MB/2.293MB<br>dc4bc61c37e8: Loading layer [==================================================&gt;]   13.9MB/13.9MB<br>3db93db6878c: Loading layer [==================================================&gt;]  7.168kB/7.168kB<br>91679720f8d1: Loading layer [==================================================&gt;]  3.072kB/3.072kB<br>7cd76e295a75: Loading layer [==================================================&gt;]  154.4MB/154.4MB<br>feee68c33bd4: Loading layer [==================================================&gt;]  3.072kB/3.072kB<br>43c8ca9cd771: Loading layer [==================================================&gt;]    183MB/183MB<br>b670df5ea093: Loading layer [==================================================&gt;]  17.41kB/17.41kB<br>e24224578084: Loading layer [==================================================&gt;]  1.536kB/1.536kB<br>Loaded image: mysql:8.0.30<br></code></pre></td></tr></table></figure>

<p>Shell 重定向机制：</p>
<figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs 1c"><span class="hljs-meta"># 实际上发生了这些步骤：</span><br><span class="hljs-meta"># 1. Shell 打开 mysql-8.0.30.tar 文件</span><br><span class="hljs-meta"># 2. Shell 将文件描述符重定向到标准输入(stdin)</span><br><span class="hljs-meta"># 3. docker load 命令从标准输入读取数据</span><br><span class="hljs-meta"># 4. Docker 解析镜像数据并存储到本地仓库</span><br></code></pre></td></tr></table></figure>

<p>创建本地数据和配置目录。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建目录</span><br><span class="hljs-built_in">mkdir</span> -p /data/mysql/data /data/mysql/logs /data/mysql/conf<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 修改所有者为 UID 999（对应容器内的 mysql 用户）</span><br><span class="hljs-built_in">chown</span> -R 999:999 /data/mysql/data /data/mysql/logs<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 赋予读写权限</span><br><span class="hljs-built_in">chmod</span> -R 755 /data/mysql/data /data/mysql/logs<br></code></pre></td></tr></table></figure>

<p>创建MySQL容器需要的三个核心目录，并设置用户所有权以及目录权限。</p>
<ul>
<li><code>/data/mysql/data</code>：<strong>数据库文件目录</strong>（表数据、索引等）</li>
<li><code>/data/mysql/logs</code>：<strong>日志文件目录</strong>（错误日志、慢查询日志等）</li>
<li><code>/data/mysql/conf</code>：<strong>配置文件目录</strong>（my.cnf等）</li>
</ul>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs applescript">/data/mysql/<br>├── data/           <span class="hljs-comment"># 数据库文件（需要mysql用户写权限）</span><br>│   ├── ibdata1     <span class="hljs-comment"># 系统表空间</span><br>│   ├── ib_logfile0 <span class="hljs-comment"># 重做日志</span><br>│   └── database/   <span class="hljs-comment"># 各个数据库</span><br>├── logs/           <span class="hljs-comment"># 日志文件（需要mysql用户写权限）</span><br>│   ├── <span class="hljs-keyword">error</span>.<span class="hljs-built_in">log</span>   <span class="hljs-comment"># 错误日志</span><br>│   └── slow.<span class="hljs-built_in">log</span>    <span class="hljs-comment"># 慢查询日志</span><br>└── conf/           <span class="hljs-comment"># 配置文件（只需读权限）</span><br>    └── <span class="hljs-keyword">my</span>.cnf      <span class="hljs-comment"># MySQL配置</span><br></code></pre></td></tr></table></figure>

<p>创建 MySQL 配置文件。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> &gt; /data/mysql/conf/my.cnf &lt;&lt;<span class="hljs-string">EOF</span><br></code></pre></td></tr></table></figure>

<p>创建文件并写入内容，用于多行文本输入，文件将保存在：<code>/data/mysql/conf/my.cnf</code>。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">[mysqld]<br>port=3306<br>datadir=/var/lib/mysql<br>socket=/tmp/mysql.sock<br>pid-file=/var/run/mysqld/mysqld.pid<br>character-set-server=utf8mb4<br>symbolic-links=0<br>user=mysql<br>lower-case-table-names=1<br>log-error=/var/log/mysql/error.log<br>sql_mode=<span class="hljs-string">&#x27;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#x27;</span><br>default_authentication_plugin=mysql_native_password<br>EOF<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">[mysqld]<br>port=3306                    <span class="hljs-comment"># MySQL服务端口</span><br>datadir=/var/lib/mysql       <span class="hljs-comment"># 数据文件存储路径（容器内路径）</span><br>socket=/tmp/mysql.sock       <span class="hljs-comment"># Unix Socket文件路径</span><br>pid-file=/var/run/mysqld/mysqld.pid  <span class="hljs-comment"># 进程ID文件路径</span><br>user=mysql                   <span class="hljs-comment"># 运行MySQL服务的系统用户</span><br>symbolic-links=0             <span class="hljs-comment"># 禁用符号链接（安全加固）</span><br>character-set-server=utf8mb4  <span class="hljs-comment"># 设置默认字符集为UTF8MB4（支持emoji等）</span><br>lower-case-table-names=1     <span class="hljs-comment"># 表名不区分大小写</span><br>log-error=/var/log/mysql/error.log  <span class="hljs-comment"># 错误日志路径</span><br>sql_mode=<span class="hljs-string">&#x27;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#x27;</span>      <span class="hljs-comment"># SQL模式配置</span><br>default_authentication_plugin=mysql_native_password     <span class="hljs-comment"># 兼容性考虑：确保老版本MySQL客户端可以连接</span><br>EOF<br></code></pre></td></tr></table></figure>

<p>启动容器（注意修改密码）。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -d \<br>  --name mysql-server \<br>  -p 3306:3306 \<br>  -v /data/mysql/data:/var/lib/mysql \<br>  -v /data/mysql/logs:/var/log/mysql \<br>  -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \<br>  -e MYSQL_ROOT_PASSWORD=Mysql@89s<span class="hljs-comment"># \</span><br>  -e TZ=Asia/Shanghai \<br>  --restart=unless-stopped \<br>  mysql:8.0.30<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -d \                    <span class="hljs-comment"># 后台运行</span><br>  --name mysql-server \            <span class="hljs-comment"># 容器名称</span><br>  -p 3306:3306 \                   <span class="hljs-comment"># 端口映射</span><br>  -v /data/mysql/data:/var/lib/mysql \        <span class="hljs-comment"># 数据持久化</span><br>  -v /data/mysql/logs:/var/log/mysql \        <span class="hljs-comment"># 日志持久化</span><br>  -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \  <span class="hljs-comment"># 配置挂载</span><br>  -e MYSQL_ROOT_PASSWORD=Mysql@89s<span class="hljs-comment"># \         # root密码</span><br>  -e TZ=Asia/Shanghai \            <span class="hljs-comment"># 时区设置</span><br>  --restart=unless-stopped \       <span class="hljs-comment"># 重启策略</span><br>  mysql:8.0.30                     <span class="hljs-comment"># 镜像版本</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker run -d \</span><br>&gt;   --name mysql-server \<br>&gt;   -p 3306:3306 \<br>&gt;   -v /data/mysql/data:/var/lib/mysql \<br>&gt;   -v /data/mysql/logs:/var/log/mysql \<br>&gt;   -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \<br>&gt;   -e MYSQL_ROOT_PASSWORD=Mysql@89s<span class="hljs-comment"># \</span><br>&gt;   -e TZ=Asia/Shanghai \<br>&gt;   --restart=unless-stopped \<br>&gt;   mysql:8.0.30<br>9bc7fd9dd0c7a1f0fabf6d8b3cf712aef5a6ed89d6a19180a6be163ad30c067f<br></code></pre></td></tr></table></figure>

<p><strong>Redis 安装配置。</strong></p>
<p>上传安装包，将安装包 redis-4.0.11.tar 上传到服务器上。</p>
<p>加载 redis 镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt;redis-4.0.11.tar<br></code></pre></td></tr></table></figure>

<p>创建配置目录和数据目录。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mkdir</span> -p /data/redis/conf /data/redis/data<br></code></pre></td></tr></table></figure>

<p>创建配置文件并设置密码（注意修改密码）。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> &gt; /data/redis/conf/redis.conf &lt;&lt;<span class="hljs-string">EOF</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">requirepass Redis@89s<span class="hljs-comment">#</span><br><span class="hljs-built_in">dir</span> /data<br>port 6379<br><span class="hljs-built_in">bind</span> 0.0.0.0<br>EOF<br></code></pre></td></tr></table></figure>

<p>启动 Redis 4.0.11 容器。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -d \<br>  --name redis-server \<br>  -p 6379:6379 \<br>  -v /data/redis/conf/redis.conf:/etc/redis.conf \<br>  -v /data/redis/data:/data \<br>  --restart=always \<br>  redis:4.0.11 \<br>  redis-server /etc/redis.conf<br></code></pre></td></tr></table></figure>

<p><strong>Nginx 安装配置。</strong></p>
<p>使用<code>nginx -v</code>命令可以直接显示Nginx的版本信息。</p>
<p>使用<code>nginx -V</code>命令可以显示更详细的版本信息，包括编译选项和模块信息。</p>
<p>上传安装包，将 Nginx 安装包 nginx-1.24.0.tar 上传到服务器上。</p>
<p>加载 nginx 镜像，执行以下命令，这个命令用于将一个名为 <code>nginx-1.24.0.tar</code>的归档文件中的 Docker 镜像加载到您的本地 Docker 环境中，使其可以用于创建和运行容器。 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt;nginx-1.24.0.tar<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker load &lt;nginx-1.24.0.tar</span><br>420179ad2efa: Loading layer [==================================================&gt;]  84.18MB/84.18MB<br>13c8460bfc9a: Loading layer [==================================================&gt;]  62.52MB/62.52MB<br>b9a187a24e19: Loading layer [==================================================&gt;]  3.584kB/3.584kB<br>96c08fed6a4c: Loading layer [==================================================&gt;]  4.608kB/4.608kB<br>29492f82bbc2: Loading layer [==================================================&gt;]  3.584kB/3.584kB<br>bc4a3582faa9: Loading layer [==================================================&gt;]  7.168kB/7.168kB<br>Loaded image: nginx:1.24.0<br></code></pre></td></tr></table></figure>

<p>启动 Nginx 容器（这里先启动复制文件到宿主机）</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name nginx -d nginx:1.24.0<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker run --name nginx -d nginx:1.24.0</span><br>2e536e8ba09f054a20e558c0f34a21575ff00a15ec544b3e0ab53562ac517c3a<br></code></pre></td></tr></table></figure>

<p>创建目的挂载路径</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mkdir</span> -p /data/nginx/conf /data/nginx/log /data/nginx/html<br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-regexp">/data/</span><br>└── nginx/<br>    ├── conf/     <span class="hljs-comment"># 配置文件目录</span><br>    ├── log/      <span class="hljs-comment"># 日志文件目录</span><br>    └── html/     <span class="hljs-comment"># 网站文件目录</span><br></code></pre></td></tr></table></figure>

<p>复制容器</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 1. 复制主配置文件</span><br>docker <span class="hljs-built_in">cp</span> nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 2. 复制配置片段目录</span><br>docker <span class="hljs-built_in">cp</span> nginx:/etc/nginx/conf.d /data/nginx/conf/conf.d<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 3. 复制默认网页文件</span><br>docker <span class="hljs-built_in">cp</span> nginx:/usr/share/nginx/html /data/nginx<br></code></pre></td></tr></table></figure>

<p>删除临时容器</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">rm</span> -f nginx<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker rm -f nginx</span><br>nginx<br></code></pre></td></tr></table></figure>

<p>这个临时容器是<strong>我们之前为了获取Nginx默认配置文件而故意创建的</strong>。如果直接运行并挂载空目录，容器内的 <code>/etc/nginx</code>目录会被宿主机空目录覆盖，Nginx因缺少配置文件而启动失败</p>
<p>这个”临时容器”是<strong>有意创建且短期存在的</strong>，为了获取Nginx默认配置，完成配置复制后就可以删除。它的配置已经保存到宿主机，所以现在要删除它，然后用持久化的配置重新创建一个”正式容器”。</p>
<p>启动正式容器</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run \<br>-p 80:80 \<br>-p 10001:10001 \<br>--name nginx \<br>-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \<br>-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \<br>-v /data/nginx/log:/var/log/nginx \<br>-v /data/nginx/html:/usr/share/nginx/html \<br>-d nginx:1.24.0<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run \<br>-p 80:80 \                    <span class="hljs-comment"># 端口映射：HTTP</span><br>-p 10001:10001 \              <span class="hljs-comment"># 端口映射：自定义端口</span><br>--name nginx \                <span class="hljs-comment"># 容器命名</span><br>-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \        <span class="hljs-comment"># 挂载主配置</span><br>-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \               <span class="hljs-comment"># 挂载站点配置</span><br>-v /data/nginx/log:/var/log/nginx \                          <span class="hljs-comment"># 挂载日志目录</span><br>-v /data/nginx/html:/usr/share/nginx/html \                  <span class="hljs-comment"># 挂载网站文件</span><br>-d nginx:1.24.0               <span class="hljs-comment"># 后台运行</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker run \</span><br>&gt; -p 80:80 \<br>&gt; -p 10001:10001 \<br>&gt; --name nginx \<br>&gt; -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \<br>&gt; -v /data/nginx/conf/conf.d:/etc/nginx/conf.d \<br>&gt; -v /data/nginx/log:/var/log/nginx \<br>&gt; -v /data/nginx/html:/usr/share/nginx/html \<br>&gt; -d nginx:1.24.0<br>0a4ea3bae5b05b007da2ece6ca6f0d03e46d154c0e7356ea32fe8353c40704a0<br></code></pre></td></tr></table></figure>

<p>挂载，双向同步。</p>
<p><strong>SELinux 配置。</strong></p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">SELinux</span> 是一个内置于 Linux 内核的安全子系统，提供更精细的访问控制，以增强系统安全性。<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">getenforce<br></code></pre></td></tr></table></figure>

<p><code>getenforce</code> 这个命令用于快速查看 SELinux 的<strong>当前运行模式</strong>，通常会返回三种结果之一：</p>
<ul>
<li><strong><code>Enforcing</code><strong>：表示</strong>强制模式</strong>。SELinux 正在运行，并且会强制执行安全策略，阻止任何未经授权的访问。</li>
<li><strong><code>Permissive</code><strong>：表示</strong>宽容模式</strong>。SELinux 会记录安全违规行为，但不会实际阻止这些操作。这个模式常用于故障排除和策略调试。</li>
<li><strong><code>Disabled</code><strong>：表示</strong>已关闭</strong>。SELinux 已被完全禁用</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">setenforce 0<br></code></pre></td></tr></table></figure>

<p><code>setenforce 0</code> 这个命令能将 SELinux 从 <code>Enforcing</code>（强制模式）<strong>立即切换</strong>到 <code>Permissive</code>（宽容模式），而无需重启系统</p>
<p>永久关闭 SELinux ，需要重启后生效：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sed -i <span class="hljs-string">&#x27;s/enforcing/disabled/&#x27;</span> /etc/selinux/config<br></code></pre></td></tr></table></figure>

<p><strong>防火墙设置</strong></p>
<p>防火墙查看开放的端口。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">firewall-cmd --list-ports<br></code></pre></td></tr></table></figure>

<p>防火墙添加3306端口。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=3306/tcp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=6379/tcp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=80/tcp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=10051/tcp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=10052/tcp<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --permanent --add-port=8080/tcp<br></code></pre></td></tr></table></figure>

<p>防火墙重新加载。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --reload<br></code></pre></td></tr></table></figure>

<p>防火墙状态。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo firewall-cmd --state<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 11 月 11 日</p>
</blockquote>
<p>Zabbix-Web 服务启动后果真有问题。</p>
<p> <strong>检查容器是否真正启动成功。</strong></p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-comment"># 查看容器日志（最后20行）</span><br><span class="hljs-attribute">docker</span> logs --tail <span class="hljs-number">20</span> zabbix-web-nginx-mysql<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker logs --tail 20 zabbix-web-nginx-mysql</span><br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br>**** MySQL server is not available. Waiting 5 seconds...<br></code></pre></td></tr></table></figure>

<p>检查网络连通性。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 从 Web 容器测试数据库连接</span><br>docker <span class="hljs-built_in">exec</span> zabbix-web-nginx-mysql ping 192.168.10.195<br>docker <span class="hljs-built_in">exec</span> zabbix-web-nginx-mysql nc -zv 192.168.10.195 3306<br></code></pre></td></tr></table></figure>

<p>先把 Zabbix 的问题放一放。</p>
<p><strong>运行监测平台</strong></p>
<p>监测平台服务端。</p>
<p>连接已经启动的 MySQL 服务。</p>
<figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs accesslog"><span class="hljs-number">192.168.139.128</span><br>Mysql@89s#<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 11 月 13 日</p>
</blockquote>
<p><strong>创建数据库</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> DATABASE IF <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> sx_aiops <span class="hljs-type">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8mb4 <span class="hljs-keyword">COLLATE</span> utf8mb4_unicode_ci;<br></code></pre></td></tr></table></figure>

<p>导入外部数据， <code>sx_aiops_original.sql</code>。</p>
<p>执行成功。</p>
<p>上传后端应用包 tomm-rmgt-server.jar 和启动文件 sxrmgt.sh 到部署目录。在部署目录执行./sxrmgt.sh start 启动、./sxrmgt.sh stop关闭、./sxrmgt.shrestart重启。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mkdir</span> /opt/tomm_server<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cp</span> /home/admin tomm-aiops-server.jar /opt/tomm_server<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span>  777 /home/admin/sxrmgt.sh <br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cp</span> /home/admin sxrmgt.sh /opt/tomm_server<br></code></pre></td></tr></table></figure>

<p>后端应用端口号为 8880。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">./sxrmgt.sh start<br></code></pre></td></tr></table></figure>

<p><strong>登录测试</strong></p>
<p>默认账号密码：</p>
<figure class="highlight erlang-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs erlang-repl">tail -f nohup.outadmin <br>yxjcgly202407!!AA<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost tomm_server]<span class="hljs-comment"># ./sxrmgt.sh start</span><br>./sxrmgt.sh: line 1: $<span class="hljs-string">&#x27;\r&#x27;</span>: <span class="hljs-built_in">command</span> not found<br>./sxrmgt.sh: line 3: $<span class="hljs-string">&#x27;\r&#x27;</span>: <span class="hljs-built_in">command</span> not found<br>./sxrmgt.sh: line 10: $<span class="hljs-string">&#x27;\r&#x27;</span>: <span class="hljs-built_in">command</span> not found<br>: No such file or directoryopt/tomm_server<br>./sxrmgt.sh: line 12: $<span class="hljs-string">&#x27;\r&#x27;</span>: <span class="hljs-built_in">command</span> not found<br>./sxrmgt.sh: line 13: syntax error near unexpected token `$<span class="hljs-string">&#x27;in\r&#x27;</span><span class="hljs-string">&#x27;</span><br><span class="hljs-string">&#x27;</span>/sxrmgt.sh: line 13: `<span class="hljs-keyword">case</span> <span class="hljs-string">&quot;<span class="hljs-variable">$1</span>&quot;</span> <span class="hljs-keyword">in</span><br></code></pre></td></tr></table></figure>

<p>这个错误是因为脚本文件包含了 Windows 的换行符（<code>\r\n</code>），而在 Linux 环境下无法识别。需要将文件格式转换为 Unix 格式。</p>
<p><strong>转换文件格式</strong>：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sed -i <span class="hljs-string">&#x27;s/\r$//&#x27;</span> sxrmgt.sh<br></code></pre></td></tr></table></figure>

<p><strong>检查脚本语法</strong>：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">bash -n sxrmgt.sh<br></code></pre></td></tr></table></figure>

<p><strong>给执行权限</strong>：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> +x sxrmgt.sh<br></code></pre></td></tr></table></figure>

<p><strong>执行脚本</strong>：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">./sxrmgt.sh start<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost tomm_server]<span class="hljs-comment"># ./sxrmgt.sh start</span><br>=== start tomm-aiops-server<br>[root@localhost tomm_server]<span class="hljs-comment"># nohup: appending output to ‘nohup.out’</span><br></code></pre></td></tr></table></figure>

<p>查看是否启动。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">netstat -tuln | grep 8880<br></code></pre></td></tr></table></figure>

<p>有显示信息则启动成功。</p>
<p>妈的，文档里是在部署智能运维系统，重新打包一份运行监测 jar 包部署下试试。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cp</span> /home/admin tomm-mgt-server.jar /opt/tomm_server<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">./sxrmgt.sh start<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">tail</span> -f nohup.out<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251113105246979.png" alt="image-20251113105246979"></p>
<p>启动项目总是显示数据库连接失败，那就把配置文件里数据库配置信息修改成本机虚拟机 ip 地址，同时连接 Docker 容器里启动的 MySQL 服务，待成功执行 SQL 脚本填充库表数据后，再尝试部署项目。</p>
<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript"><span class="hljs-name">D</span>:\Project\luofeng\tomm-mgt-server\script\sql\mysql<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">url: jdbc:mysql://192.168.139.128:3306/sx_monitor?useUnicode=<span class="hljs-literal">true</span>&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=<span class="hljs-literal">true</span>&amp;serverTimezone=GMT%2B8&amp;autoReconnect=<span class="hljs-literal">true</span>&amp;rewriteBatchedStatements=<span class="hljs-literal">true</span>&amp;nullCatalogMeansCurrent=<span class="hljs-literal">true</span>&amp;allowMultiQueries=<span class="hljs-literal">true</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">host: 192.168.139.128<br></code></pre></td></tr></table></figure>

<p>徒劳了，该监测平台连接本地 MySQL 连用户名密码都不一致，这样要改动的配置就更多了，等到正式开发的时候问问就搞定的事情。</p>
<p>不考虑本机部署监测平台项目了，接下来的时间就用来研究 Zabbix 和具体的业务逻辑。</p>
<p>安装部署，到此结束。</p>
<h2 id="Zabbix"><a href="#Zabbix" class="headerlink" title="Zabbix"></a>Zabbix</h2><blockquote>
<p>2025 年 11 月 13 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7394789488618012723?searchId=20251113151342FE1AE4AAF515A268566C">分布式监控平台——Zabbix监控 一、监控的功能 在需要的时刻，提前预警即将出问题，避免故障发生 实时监控系统和业务， - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7169047487007686669?searchId=20251113151342FE1AE4AAF515A268566C">zabbix分布式监控平台zabbix监控系统概述 zabbix 是什么？ zabbix 是一个基于 Web 界面的提供 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/yanjing998/p/17306350.html">zabbix介绍及部署（超详细讲解） - 靖安yj - 博客园</a></p>
<p><strong>工作流程：</strong></p>
<p>Zabbix 在进行监控时，zabbix 客户端要安装在被监控设备上，负责定期收集数据，并将其发送给 zabbix 服务端；</p>
<p>zabbix 服务端要安装在监控设备上，其将 zabbix 客户端发送的数据存储的数据库中，zabbix web 根据数据在前端进行展示和绘图。</p>
<p><strong>工作模式：</strong></p>
<p>主动模式：zabbix 客户端主动向 zabbix server请求监控项列表，并主动将监控项内需要的数据提交给 zabbix server。</p>
<p>被动模式：zabbix server向 agent 请求获取监控项的数据，zabbix agent 返回数据。</p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">zabbix</span> 的主动和被动模式是以 zabbxi 客户端为基准的。<br></code></pre></td></tr></table></figure>

<p><strong>五个模块。</strong></p>
<ol>
<li>Zabbix_Server：zabbix_server作为核心组件，用来获取agent存活情况和监控数据。所有的配置、统计、操作数据均通过server进行存取到database；</li>
<li>Zabbix_Database：用户存储所有的zabbix的配置信息、监控数据的数据库；</li>
<li>Zabbix_Web：zabbix的web界面，管理员通过web界面管理zabbix配置以及查看zabbix相关监控信息，通常与zabbix_server运行在同一台主机上，也可以单独部署在独立的服务器上；</li>
<li>Zabbix_Proxy：通常用于分布式监控，代理zabbix_server收集部分被监控的数据并统一发送给server端；（通常大于500台主机需要使用）</li>
<li>Zabbix_Agent：部署在被监控主机上，负责收集被监控主机的数据，并发送给servre端或者proxy端；</li>
</ol>
<p>Zabbix Server、Proxy、Agent都有自己的配置文件以及log文件，重要的参数需要在这里配置，后面会详细说明。</p>
<p><strong>六个进程。</strong></p>
<p>在默认的情况下，zabbix有6个工作进程；分别是 zabbix_agentd，zabbix_get，zabbix_proxy，zabbix_sender，zabbix_server 和 zabbix_gateway。</p>
<p>其中，zabbix_java_gateway 是可选进程。这6个进程的作用如下：</p>
<ol>
<li>zabbix-agentd 为 zabbix 客户端守护进程 ，主要负责收集客户端监控项数据。</li>
<li>zabbix_server 为zabbix服务端守护进程，主要负责收集zabbix客户端数据。（端口为10051）</li>
<li>zabbix_proxy是zabbix的代理程序，其功能类似于server，作用上类似于一个中转站，最终会把收集的数据再次提交给zabbix_server。</li>
<li>zabbix_get作为zabbix工具，通常运行在zabbix_server或者zabbix_proxy上，用于远程获取客户端信息，通常用于排错。</li>
<li>zabbix_sender也是zabbix的一个工具，通常运行在zabbix的客户端，用于耗时比较长的检查，其作用是主动发送数据。</li>
<li>zabbix_java_gateway是zabbix2.0以后引入的新功能，可以用于JAVA方面的设备；但是只能主动获取数据，而不能被动获取数据。</li>
</ol>
<p><strong>三种框架。</strong></p>
<p>在实际的工作环境中，根据网络环境和监控的规模不同，zabbix一共有三种框架，分别是server_client架构、master_node_client架构和server_proxy_client架构。</p>
<p>1、server_client架构</p>
<p>zabbix最简单的架构，监控设备和被监控设备之间直接相连，zabbix_server 和 zabbix_client 之间直接进行数据交互。</p>
<p>2、zabbix_proxy_client架构</p>
<p>proxy是连接 server 和 client 之间的桥梁，其本身不存放数据，只是将zabbix_agent端发来的数据暂存，然后再提交给server。这种架构一般用于跨机房、跨网络的中型网络架构。</p>
<p>在server_proxy_client架构中，server设备的宕机会导致整个系统瘫痪而无法正常工作。</p>
<p>3、master_node_client架构</p>
<p>master_node_client架构是zabbix最复杂的架构。一般用于跨机房、跨网络、监控设备较多的大型网络架构。与server_proxy_client架构相比，master_node_client架构的主要区别在于node与proxy上.</p>
<p>在master_node_client架构中，每个node可以理解为一个小的server端，在自己的配置文件和数据库，node下游可以直接连接client，也可以再次经过proxy代理后连接client。</p>
<p>在master_node_client架构中，master设备宕机不会影响node节点的正常工作。</p>
<blockquote>
<p>2025 年 11 月 11 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/yanjing998/p/17306350.html">zabbix介绍及部署（超详细讲解） - 靖安yj - 博客园</a></p>
<blockquote>
<p>2025 年 11 月 10 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.zabbix.com/cn/">Zabbix：企业级开源监控解决方案</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7169047487007686669?searchId=20251110160147DA94A0DA6D91CF012D90">zabbix分布式监控平台zabbix监控系统概述 zabbix 是什么？ zabbix 是一个基于 Web 界面的提供 - 掘金</a></p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">Zabbix</span> 是一个企业级开源分布式监控解决方案。<br><br>Zabbix 是一种监控网络众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等健康状况和完整性的软件。Zabbix 使用灵活的通知机制，允许用户为几乎任何事件配置基于电子邮件的警报，从而快速响应服务器问题。Zabbix 提供基于存储数据的优秀报告和数据可视化功能，使其非常适合容量规划。<br></code></pre></td></tr></table></figure>

<p><strong>Zabbix 安装配置</strong></p>
<p><strong>安装 zabbix-java-gateway。</strong></p>
<p>先上传 zabbix-java-gateway.latest.tar。</p>
<p>docker 加载镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt;zabbix-java-gateway.latest.tar<br></code></pre></td></tr></table></figure>

<p>docker 启动。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-java-gateway -t --restart=unless-stopped -p 10052:10052 -e TZ=Asia/Shanghai -d zabbix/zabbix-java-gateway:latest<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-java-gateway -t \    <span class="hljs-comment"># 容器命名和伪终端</span><br>  --restart=unless-stopped \                  <span class="hljs-comment"># 重启策略</span><br>  -p 10052:10052 \                           <span class="hljs-comment"># 端口映射</span><br>  -e TZ=Asia/Shanghai \                      <span class="hljs-comment"># 时区设置</span><br>  -d zabbix/zabbix-java-gateway:latest       <span class="hljs-comment"># 后台运行最新镜像</span><br></code></pre></td></tr></table></figure>

<p>Zabbix Java Gateway 是一个独立的守护进程，专门用于监控 <strong>Java应用程序</strong> 的 <strong>JMX（Java Management Extensions）</strong> 指标。</p>
<p><strong>安装 zabbix-server</strong></p>
<p>上传 zabbix-server-mysql.ol-6.4.13.tar。</p>
<p>docker 加载镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt;zabbix-server-mysql.ol-6.4.13.tar<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker load &lt;zabbix-server-mysql.ol-6.4.13.tar</span><br>0a628c3f1dfa: Loading layer [==================================================&gt;]  114.3MB/114.3MB<br>9f123eed27d1: Loading layer [==================================================&gt;]  5.131MB/5.131MB<br>f1a18cee03fd: Loading layer [==================================================&gt;]  174.6kB/174.6kB<br>1b8a4a73d477: Loading layer [==================================================&gt;]  328.2kB/328.2kB<br>4c55089aa5fe: Loading layer [==================================================&gt;]  30.21kB/30.21kB<br>acb81b6f8559: Loading layer [==================================================&gt;]  4.135MB/4.135MB<br>4694e9d5278c: Loading layer [==================================================&gt;]  3.072kB/3.072kB<br>843f0fd7d625: Loading layer [==================================================&gt;]  115.6MB/115.6MB<br>5f70bf18a086: Loading layer [==================================================&gt;]  1.024kB/1.024kB<br>6f7ed932e3b9: Loading layer [==================================================&gt;]  24.58kB/24.58kB<br>Loaded image: zabbix/zabbix-server-mysql:ol-6.4.13<br></code></pre></td></tr></table></figure>

<p>docker启动（注意数据库root密码）。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-server-mysql -t -v zabbix_server:/etc/zabbix -e TZ=Asia/Shanghai -e DB_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> -e MYSQL_DATABASE=<span class="hljs-string">&quot;zabbix&quot;</span> -e MYSQL_USER=<span class="hljs-string">&quot;zabbix&quot;</span> -e MYSQL_PASSWORD=<span class="hljs-string">&quot;Zabbix@89s#&quot;</span> -e MYSQL_ROOT_PASSWORD=<span class="hljs-string">&quot;Mysql@89s#&quot;</span> -e ZBX_JAVAGATEWAY=<span class="hljs-string">&quot;zabbix-java-gateway&quot;</span> --restart=unless-stopped  -p 10051:10051 --user=root -d zabbix/zabbix-server-mysql:ol-6.4.13<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-server-mysql -t \        <span class="hljs-comment"># 容器命名和伪终端</span><br>  -v zabbix_server:/etc/zabbix \                  <span class="hljs-comment"># 配置卷挂载</span><br>  -e TZ=Asia/Shanghai \                          <span class="hljs-comment"># 时区设置</span><br>  -e DB_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> \           <span class="hljs-comment"># 数据库服务器地址</span><br>  -e MYSQL_DATABASE=<span class="hljs-string">&quot;zabbix&quot;</span> \                   <span class="hljs-comment"># 数据库名</span><br>  -e MYSQL_USER=<span class="hljs-string">&quot;zabbix&quot;</span> \                       <span class="hljs-comment"># 数据库用户</span><br>  -e MYSQL_PASSWORD=<span class="hljs-string">&quot;Zabbix@89s#&quot;</span> \              <span class="hljs-comment"># 数据库密码</span><br>  -e MYSQL_ROOT_PASSWORD=<span class="hljs-string">&quot;Mysql@89s#&quot;</span> \           <span class="hljs-comment"># root密码（可能不需要）</span><br>  -e ZBX_JAVAGATEWAY=<span class="hljs-string">&quot;zabbix-java-gateway&quot;</span> \     <span class="hljs-comment"># Java Gateway连接</span><br>  --restart=unless-stopped \                     <span class="hljs-comment"># 重启策略</span><br>  -p 10051:10051 \                               <span class="hljs-comment"># 服务端口映射</span><br>  --user=root \                                  <span class="hljs-comment"># 运行用户</span><br>  -d zabbix/zabbix-server-mysql:ol-6.4.13        <span class="hljs-comment"># 镜像版本</span><br></code></pre></td></tr></table></figure>

<p><strong>安装 zabbix-web</strong></p>
<p>上传 zabbix-web-nginx-mysql.latest.tar。</p>
<p>docker 加载镜像。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker load &lt; zabbix-web-nginx-mysql.latest.tar<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># docker load &lt; zabbix-web-nginx-mysql.latest.tar</span><br>b5221e4692d2: Loading layer [==================================================&gt;]  98.55MB/98.55MB<br>72523de8d6bb: Loading layer [==================================================&gt;]  27.14kB/27.14kB<br>da371a8f2857: Loading layer [==================================================&gt;]  143.6MB/143.6MB<br>5f70bf18a086: Loading layer [==================================================&gt;]  1.024kB/1.024kB<br>ce903e83adf6: Loading layer [==================================================&gt;]  11.78kB/11.78kB<br>Loaded image: zabbix/zabbix-web-nginx-mysql:latest<br></code></pre></td></tr></table></figure>

<p>docker启动（注意数据库 root 密码）。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-web-nginx-mysql -t -e PHP_TZ=<span class="hljs-string">&quot;Asia/Shanghai&quot;</span> -e ZBX_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> -e DB_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> -e MYSQL_DATABASE=<span class="hljs-string">&quot;zabbix&quot;</span> -e MYSQL_USER=<span class="hljs-string">&quot;zabbix&quot;</span> -e MYSQL_PASSWORD=<span class="hljs-string">&quot;Zabbix@89s#&quot;</span> -e MYSQL_ROOT_PASSWORD=<span class="hljs-string">&quot;Mysql@89s#&quot;</span> -p 8080:8080 --restart unless-stopped --user=root -d zabbix/zabbix-web-nginx-mysql:latest<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name zabbix-web-nginx-mysql -t \    <span class="hljs-comment"># 容器命名和伪终端</span><br>  -e PHP_TZ=<span class="hljs-string">&quot;Asia/Shanghai&quot;</span> \                    <span class="hljs-comment"># PHP时区设置</span><br>  -e ZBX_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> \          <span class="hljs-comment"># Zabbix服务器地址</span><br>  -e DB_SERVER_HOST=<span class="hljs-string">&quot;192.168.10.195&quot;</span> \           <span class="hljs-comment"># 数据库服务器地址</span><br>  -e MYSQL_DATABASE=<span class="hljs-string">&quot;zabbix&quot;</span> \                   <span class="hljs-comment"># 数据库名</span><br>  -e MYSQL_USER=<span class="hljs-string">&quot;zabbix&quot;</span> \                       <span class="hljs-comment"># 数据库用户</span><br>  -e MYSQL_PASSWORD=<span class="hljs-string">&quot;Zabbix@89s#&quot;</span> \              <span class="hljs-comment"># 数据库密码</span><br>  -e MYSQL_ROOT_PASSWORD=<span class="hljs-string">&quot;Mysql@89s#&quot;</span> \           <span class="hljs-comment"># root密码（可能不需要）</span><br>  -p 8080:8080 \                                 <span class="hljs-comment"># Web端口映射</span><br>  --restart unless-stopped \                     <span class="hljs-comment"># 重启策略</span><br>  --user=root \                                  <span class="hljs-comment"># 运行用户</span><br>  -d zabbix/zabbix-web-nginx-mysql:latest        <span class="hljs-comment"># 最新镜像</span><br></code></pre></td></tr></table></figure>

<p>默认账号和密码：</p>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">Admin zabbix</span><br></code></pre></td></tr></table></figure>

<p>更新容器中 <code>/usr/share/zabbix/include/defines.inc.php</code>，解决名称无法中文问题。</p>
<p>覆盖容器内文件:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">cp</span> defines.inc.php zabbix-web-nginx-mysql:/usr/share/zabbix/include/defines.inc.php<br></code></pre></td></tr></table></figure>

<p>进入容器:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it zabbix-web-nginx-mysql bash<br></code></pre></td></tr></table></figure>

<p>授权文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> +r /usr/share/zabbix/include/defines.inc.php<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">exit</span><br></code></pre></td></tr></table></figure>

<p>重启容器：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker restart zabbix-web-nginx-mysql<br></code></pre></td></tr></table></figure>

<p>上传模板</p>
<ul>
<li>删除 模板中的system.sw.os键值（模板监控项）</li>
<li>先导入zbx_export_templates (34).yaml再导入zbx_export_templates (33).yaml</li>
</ul>
<p>添加主机群组公司名、公司名/收费站服务器、公司名/车道工控机、公司名/门架工控机/、公司名/门架服务器。</p>
<p><strong>安装 zabbix-sender</strong></p>
<p>上传 zabbix-sender-6.4.7-release1.el8.x86_64.rpm。</p>
<p>安装。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">rpm -ivh zabbix-sender-6.4.7-release1.el8.x86_64.rpm<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># rpm -ivh zabbix-sender-6.4.7-release1.el8.x86_64.rpm</span><br>warning: zabbix-sender-6.4.7-release1.el8.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY<br>error: Failed dependencies:<br>        libcrypto.so.1.1()(64bit) is needed by zabbix-sender-6.4.7-release1.el8.x86_64<br>        libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) is needed by zabbix-sender-6.4.7-release1.el8.x86_64<br>        libssl.so.1.1()(64bit) is needed by zabbix-sender-6.4.7-release1.el8.x86_64<br>        libssl.so.1.1(OPENSSL_1_1_0)(64bit) is needed by zabbix-sender-6.4.7-release1.el8.x86_64<br>        libssl.so.1.1(OPENSSL_1_1_1)(64bit) is needed by zabbix-sender-6.4.7-release1.el8.x86_64<br></code></pre></td></tr></table></figure>

<p>这个错误表明 <strong>Zabbix Sender 需要 OpenSSL 1.1 版本的库</strong>，但该系统可能缺少或版本不匹配。</p>
<p>检查当前 OpenSSL 版本。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">openssl version<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># openssl version</span><br>OpenSSL 1.0.2k-fips  26 Jan 2017<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">rpm -qa | grep openssl<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># rpm -qa | grep openssl</span><br>xmlsec1-openssl-1.2.20-5.el7.x86_64<br>openssl-libs-1.0.2k-8.el7.x86_64<br>openssl-1.0.2k-8.el7.x86_64<br></code></pre></td></tr></table></figure>

<p>解决办法，不奏效。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo rpm -ivh compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># sudo rpm -ivh compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm</span><br>warning: compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID c21ad6ea: NOKEY<br>error: Failed dependencies:<br>        crypto-policies is needed by compat-openssl10-1:1.0.2o-4.el8_6.x86_64<br>        openssl &lt; 1:1.1.0 conflicts with compat-openssl10-1:1.0.2o-4.el8_6.x86_64<br>        openssl-libs &lt; 1:1.1.0 conflicts with compat-openssl10-1:1.0.2o-4.el8_6.x86_64<br></code></pre></td></tr></table></figure>

<p>先强制安装 zabbix-sender。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo rpm -ivh --nodeps zabbix-sender-6.4.7-release1.el8.x86_64.rpm<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># sudo rpm -ivh --nodeps zabbix-sender-6.4.7-release1.el8.x86_64.rpm</span><br>warning: zabbix-sender-6.4.7-release1.el8.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY<br>Preparing...                          <span class="hljs-comment">################################# [100%]</span><br>Updating / installing...<br>   1:zabbix-sender-6.4.7-release1.el8 <span class="hljs-comment">################################# [100%]</span><br></code></pre></td></tr></table></figure>

<p>再手动补全缺失的 so 文件。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查找系统现有的openssl库</span><br>find /usr/lib64 -name <span class="hljs-string">&quot;libssl.so*&quot;</span><br>find /usr/lib64 -name <span class="hljs-string">&quot;libcrypto.so*&quot;</span><br><br><span class="hljs-comment"># 创建软链接（假设您有libssl.so.1.1.1和libcrypto.so.1.1.1）</span><br>sudo <span class="hljs-built_in">ln</span> -s /usr/lib64/libssl.so.1.1.1 /usr/lib64/libssl.so.1.1<br>sudo <span class="hljs-built_in">ln</span> -s /usr/lib64/libcrypto.so.1.1.1 /usr/lib64/libcrypto.so.1.1<br>sudo ldconfig<br></code></pre></td></tr></table></figure>

<p>最后验证是否修复。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ldd $(<span class="hljs-built_in">which</span> zabbix_sender)<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># ldd $(which zabbix_sender)</span><br>        linux-vdso.so.1 =&gt;  (0x00007ffd227a0000)<br>        libz.so.1 =&gt; /lib64/libz.so.1 (0x00007fe792969000)<br>        libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007fe79274d000)<br>        libssl.so.1.1 =&gt; not found<br>        libcrypto.so.1.1 =&gt; not found<br>        libm.so.6 =&gt; /lib64/libm.so.6 (0x00007fe79244a000)<br>        libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007fe792245000)<br>        libresolv.so.2 =&gt; /lib64/libresolv.so.2 (0x00007fe79202b000)<br>        libpcre2-8.so.0 =&gt; /lib64/libpcre2-8.so.0 (0x00007fe791db4000)<br>        libc.so.6 =&gt; /lib64/libc.so.6 (0x00007fe7919f0000)<br>        /lib64/ld-linux-x86-64.so.2 (0x000055f119672000)<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># find /usr/lib64 -name &quot;libssl.so*&quot; -o -name &quot;libcrypto.so*&quot;</span><br>/usr/lib64/libcrypto.so.1.0.2k<br>/usr/lib64/libcrypto.so.10<br>/usr/lib64/libssl.so.1.0.2k<br>/usr/lib64/libssl.so.10<br><br>[root@localhost admin]<span class="hljs-comment"># ls -la /usr/lib64/libssl.so*</span><br>lrwxrwxrwx. 1 root root     16 Nov  5 01:10 /usr/lib64/libssl.so.10 -&gt; libssl.so.1.0.2k<br>-rwxr-xr-x. 1 root root 470336 Aug  3  2017 /usr/lib64/libssl.so.1.0.2k<br><br>[root@localhost admin]<span class="hljs-comment"># ls -la /usr/lib64/libcrypto.so*</span><br>lrwxrwxrwx. 1 root root      19 Nov  5 01:10 /usr/lib64/libcrypto.so.10 -&gt; libcrypto.so.1.0.2k<br>-rwxr-xr-x. 1 root root 2512448 Aug  3  2017 /usr/lib64/libcrypto.so.1.0.2k<br><br>[root@localhost admin]<span class="hljs-comment"># rpm -qa | grep openssl</span><br>xmlsec1-openssl-1.2.20-5.el7.x86_64<br>openssl-libs-1.0.2k-8.el7.x86_64<br>openssl-1.0.2k-8.el7.x86_64<br><br></code></pre></td></tr></table></figure>

<p>该系统是 <strong>CentOS 7</strong>，安装的是 <strong>OpenSSL 1.0.2k</strong>，但 Zabbix Sender 需要的是 <strong>OpenSSL 1.1.x</strong>。这就是版本不匹配的根本原因。</p>
<p>接下来整体的解决思路是这样的：</p>
<p><strong>方案一：安装 OpenSSL 1.1（推荐）</strong></p>
<p>由于有内网 yum 源，直接安装 OpenSSL 1.1：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 安装 OpenSSL 1.1</span><br>sudo yum install openssl11 openssl11-libs<br><br><span class="hljs-comment"># 创建符号链接</span><br>sudo <span class="hljs-built_in">ln</span> -sf /usr/lib64/openssl11/libssl.so.1.1 /usr/lib64/libssl.so.1.1<br>sudo <span class="hljs-built_in">ln</span> -sf /usr/lib64/openssl11/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1<br>sudo ldconfig<br></code></pre></td></tr></table></figure>

<p><strong>方案二：如果方案一失败，使用兼容方案</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建兼容性符号链接（将1.0链接为1.1）</span><br>sudo <span class="hljs-built_in">ln</span> -sf /usr/lib64/libssl.so.1.0.2k /usr/lib64/libssl.so.1.1<br>sudo <span class="hljs-built_in">ln</span> -sf /usr/lib64/libcrypto.so.1.0.2k /usr/lib64/libcrypto.so.1.1<br>sudo ldconfig<br></code></pre></td></tr></table></figure>

<p><strong>方案三：下载 CentOS 7 兼容的 Zabbix Sender</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 卸载当前的错误版本</span><br>sudo rpm -e zabbix-sender<br><br><span class="hljs-comment"># 下载 CentOS 7 兼容的版本（如果有）</span><br><span class="hljs-comment"># 或者从 Zabbix 官网下载对应 CentOS 7 的 RPM 包</span><br></code></pre></td></tr></table></figure>

<p>立即验证，验证是否修复。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ldd $(<span class="hljs-built_in">which</span> zabbix_sender)<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># ldd $(which zabbix_sender)</span><br>/bin/zabbix_sender: /lib64/libcrypto.so.1.1: version `OPENSSL_1_1_0<span class="hljs-string">&#x27; not found (required by /bin/zabbix_sender)</span><br><span class="hljs-string">/bin/zabbix_sender: /lib64/libssl.so.1.1: version `OPENSSL_1_1_1&#x27;</span> not found (required by /bin/zabbix_sender)<br>/bin/zabbix_sender: /lib64/libssl.so.1.1: version `OPENSSL_1_1_0<span class="hljs-string">&#x27; not found (required by /bin/zabbix_sender)</span><br><span class="hljs-string">        linux-vdso.so.1 =&gt;  (0x00007fff7bff9000)</span><br><span class="hljs-string">        libz.so.1 =&gt; /lib64/libz.so.1 (0x00007fa037cc2000)</span><br><span class="hljs-string">        libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007fa037aa6000)</span><br><span class="hljs-string">        libssl.so.1.1 =&gt; /lib64/libssl.so.1.1 (0x00007fa037833000)</span><br><span class="hljs-string">        libcrypto.so.1.1 =&gt; /lib64/libcrypto.so.1.1 (0x00007fa0373d2000)</span><br><span class="hljs-string">        libm.so.6 =&gt; /lib64/libm.so.6 (0x00007fa0370d0000)</span><br><span class="hljs-string">        libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007fa036ecb000)</span><br><span class="hljs-string">        libresolv.so.2 =&gt; /lib64/libresolv.so.2 (0x00007fa036cb1000)</span><br><span class="hljs-string">        libpcre2-8.so.0 =&gt; /lib64/libpcre2-8.so.0 (0x00007fa036a3a000)</span><br><span class="hljs-string">        libc.so.6 =&gt; /lib64/libc.so.6 (0x00007fa036676000)</span><br><span class="hljs-string">        /lib64/ld-linux-x86-64.so.2 (0x0000564d9803d000)</span><br><span class="hljs-string">        libgssapi_krb5.so.2 =&gt; /lib64/libgssapi_krb5.so.2 (0x00007fa036429000)</span><br><span class="hljs-string">        libkrb5.so.3 =&gt; /lib64/libkrb5.so.3 (0x00007fa036141000)</span><br><span class="hljs-string">        libcom_err.so.2 =&gt; /lib64/libcom_err.so.2 (0x00007fa035f3c000)</span><br><span class="hljs-string">        libk5crypto.so.3 =&gt; /lib64/libk5crypto.so.3 (0x00007fa035d09000)</span><br><span class="hljs-string">        libkrb5support.so.0 =&gt; /lib64/libkrb5support.so.0 (0x00007fa035afa000)</span><br><span class="hljs-string">        libkeyutils.so.1 =&gt; /lib64/libkeyutils.so.1 (0x00007fa0358f6000)</span><br><span class="hljs-string">        libselinux.so.1 =&gt; /lib64/libselinux.so.1 (0x00007fa0356ce000)</span><br><span class="hljs-string">        libpcre.so.1 =&gt; /lib64/libpcre.so.1 (0x00007fa03546c000)</span><br></code></pre></td></tr></table></figure>

<p>查看。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">zabbix_sender --version<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@localhost admin]<span class="hljs-comment"># zabbix_sender --version</span><br>zabbix_sender: /lib64/libcrypto.so.1.1: version `OPENSSL_1_1_0<span class="hljs-string">&#x27; not found (required by zabbix_sender)</span><br><span class="hljs-string">zabbix_sender: /lib64/libssl.so.1.1: version `OPENSSL_1_1_1&#x27;</span> not found (required by zabbix_sender)<br>zabbix_sender: /lib64/libssl.so.1.1: version `OPENSSL_1_1_0<span class="hljs-string">&#x27; not found (required by zabbix_sender)</span><br></code></pre></td></tr></table></figure>

<p>目前还是这样的问题。</p>
<p>考虑到生产环境下在内网中操作，最可靠的解决方案还是：重新安装兼容 CentOS 7 的 Zabbix Sender。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 卸载当前版本</span><br>sudo rpm -e zabbix-sender<br><br><span class="hljs-comment"># 安装 CentOS 7 兼容的 Zabbix 版本</span><br><span class="hljs-comment"># 从 Zabbix 官网下载对应版本：https://www.zabbix.com/download</span><br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://www.zabbix.com/download">Download and install Zabbix</a></p>
<p>搞半天安装的 <code>zabbix-sender-6.4.7-release1.el8.x86_64.rpm</code>是问题的根源，这是为 <strong>CentOS 8</strong> 构建的包，但我的系统是 <strong>CentOS 7</strong>。</p>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs arduino">被监控主机 ──────────────────&gt; Zabbix <span class="hljs-built_in">Server</span> ─────────────────&gt; 用户<br>    │                              │                              │<br>    ├─ zabbix-<span class="hljs-built_in">agent2</span> (被动采集)     │                              │<br>    ├─ zabbix-<span class="hljs-built_in">sender</span> (主动上报)     ├─ 数据处理/存储               ├─ zabbix-<span class="hljs-built_in">web</span> (界面)<br>    └─ Java应用 ─&gt; Java Gateway     └─ 告警判断                   └─ 图表展示<br></code></pre></td></tr></table></figure>

<p>各组件端口说明。</p>
<table>
<thead>
<tr>
<th align="left">组件</th>
<th align="left">默认端口</th>
<th align="left">方向</th>
<th align="left">用途</th>
</tr>
</thead>
<tbody><tr>
<td align="left">zabbix-server</td>
<td align="left">10051</td>
<td align="left">入站</td>
<td align="left">接收 agent/sender 数据</td>
</tr>
<tr>
<td align="left">zabbix-agent2</td>
<td align="left">10050</td>
<td align="left">出站</td>
<td align="left">向 server 发送数据</td>
</tr>
<tr>
<td align="left">zabbix-java-gateway</td>
<td align="left">10052</td>
<td align="left">入站</td>
<td align="left">接收 JMX 监控数据</td>
</tr>
<tr>
<td align="left">zabbix-web</td>
<td align="left">80/443</td>
<td align="left">入站</td>
<td align="left">Web 管理界面</td>
</tr>
</tbody></table>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">netstat -natp | grep zabbix<br></code></pre></td></tr></table></figure>

<p>先跳过。</p>
<p><img src="http://blog.memory-life.xyz/image-20251111115156300.png" alt="image-20251111115156300"></p>
<p><strong>安装 zabbix-agent2</strong></p>
<p>Centos</p>
<p>上传zabbix-agent2-6.4.7-releasel.e18.x86_64.rpm</p>
<p>安装rpm -ivh zabbix-agent2-6.4.7-release1.el8.x86_64.rpm</p>
<p>vi /etc/zabbix/zabbix_agent2.conf</p>
<p>主要修改以下配置：</p>
<p>Server=::/0                   #允许所有地址访问</p>
<p>ServerActive=10.14.210.139         #Zabbix Proxy地址</p>
<p>Hostname=Zabbix Server 1      #需要与Zabbix Server的配置一致</p>
<p>默认监听端口是10050，不用修改。 </p>
<p>设置开机启动systemctl enable zabbix-agent2</p>
<p>启动systemctl start zabbix-agent2</p>
<p>查看日志，看看是否运行正常</p>
<p>tail -f /var/log/zabbix/zabbix_agent2.log</p>
<p>或者看看端口是否启动</p>
<p>netstat -tanlp |grep 10050</p>
<p>Window Server</p>
<p>浏览器 输入127.0.0.1:9009</p>
<p>打开服务services.msc</p>
<p>ServerActive 改为 10.14.128.76:12099</p>
<p>Server 改为 ::/0</p>
<p>容器</p>
<p>上传zabbix-agent2-alpine-6.4-latest.tar</p>
<p>加载镜像docker load &lt;zabbix-agent2-alpine-6.4-latest.tar</p>
<p>启动容器（替换ip这里需要两个ip,后边的ip需要启动后查看报错ip并替换重启）</p>
<p>docker run –name zabbix-agent2 -t -e TZ=Asia/Shanghai -e ZBX_SERVER_HOST=”10.14.139.226” -e ZBX_HOSTNAME=”Zabbix server” -v /var/run/docker.sock:/var/run/docker.sock:ro -p 10050:10050  –restart=unless-stopped -d zabbix/zabbix-agent2:alpine-6.4-latest</p>
<h2 id="收费系统"><a href="#收费系统" class="headerlink" title="收费系统"></a>收费系统</h2><blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">glpat-vtQtz1YtzToB6L7W5Cgn<br></code></pre></td></tr></table></figure>

<p>添加了个访问令牌，拉取代码还是报错，算了解决下SSH密钥配置问题吧。</p>
<p>本机重新生成SSH密钥。</p>
<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">ssh-keygen -t rsa -<span class="hljs-selector-tag">b</span> <span class="hljs-number">4096</span> -C &quot;your_email<span class="hljs-keyword">@example</span>.com<br></code></pre></td></tr></table></figure>

<p>Gitlab平台配置该SSH密钥。</p>
<blockquote>
<p>2025 年 11 月 13 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2583695">有哪些常见的Docker容器操作命令？掌握这些Docker命令，让容器管理事半功倍-腾讯云开发者社区-腾讯云</a></p>
<p>【腾讯文档】加班统计表 <a target="_blank" rel="noopener" href="https://docs.qq.com/sheet/DTEFLY3p2R0tQV0pU?tab=000001">https://docs.qq.com/sheet/DTEFLY3p2R0tQV0pU?tab=000001</a></p>
<p><strong>history 模块</strong>是一个专注于时序数据管理的模块，它通过合理的数据分类存储策略，为系统提供了高效的历史监控数据管理能力。该模块的设计充分考虑了大数据量、高并发场景下的性能需求，通过批量操作、增量同步和定期清理等机制，保证了系统的稳定性和响应速度。</p>
<p>从业务角度看，该模块为整个监控系统提供了数据持久化和历史查询的基础设施，支持上层应用进行趋势分析、报表生成等高级功能。</p>
<p><strong>knowledge 模块</strong>是一个典型的知识库管理系统实现，采用了标准的三层架构和清晰的对象职责划分。该模块提供了知识库内容的完整CRUD操作和基于树形结构的分类菜单管理功能。</p>
<p>代码整体设计规范，使用了MyBatis-Plus等主流框架提高开发效率，同时预留了数据校验等扩展点。虽然存在一些小的代码问题，但整体实现了完整的业务功能，能够满足知识库管理的基本需求。</p>
<p><strong>Section 模块</strong>主要提供高速公路交通监控系统的数据统计、分析和展示功能，支持：</p>
<ul>
<li>实时监控设备状态和性能指标</li>
<li>告警分析和趋势预测</li>
<li>数据传输质量监控</li>
<li>大屏可视化展示</li>
<li>支持决策分析和问题定位</li>
</ul>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">生产环境下常用的 Docker 命令<br></code></pre></td></tr></table></figure>

<p><strong>sync 模块</strong>是TOMM管理系统中的数据同步核心模块，主要负责接收和处理来自路段侧的数据同步请求，实现省中心与路段侧的数据一致性和实时性。该模块支持多种数据类型的同步，包括部门、资产、告警、监控项等18种不同类型的数据。</p>
<p><strong>system 模块</strong>是整个系统的核心模块，主要负责以下关键业务功能：</p>
<ol>
<li>资产管理 ：提供资产信息的CRUD操作，支持资产分类管理、关联关系维护、资产详情记录等功能，区分省中心和路段两级数据管理模式。</li>
<li>告警管理 ：实现告警数据的查询、统计、趋势分析、历史记录管理等功能，支持告警级别分类、告警策略匹配、告警关闭和恢复处理。</li>
<li>系统配置 ：提供参数配置的CRUD操作、缓存管理、键名唯一性校验等功能，支持系统参数的动态配置和管理。</li>
<li>路段管理 ：实现路段信息的基础CRUD操作，支持路段编号、名称、授权码、服务器IP等信息管理。</li>
<li>用户管理 ：提供用户分页查询、列表查询和条件过滤等功能，支持多表关联查询。</li>
</ol>
<blockquote>
<p>2025 年 11 月 12 日</p>
</blockquote>
<p><strong>已使用的微服务相关组件：</strong></p>
<ol>
<li>Spring Cloud OpenFeign<ul>
<li>项目中通过 @EnableFeignClients 启用了Feign客户端</li>
<li>实现了 SectionApiClient 接口用于服务间调用</li>
<li>配置了动态Feign客户端( DynamicFeignClientConfiguration )</li>
<li>值得注意的是，项目禁用了负载均衡功能( FeignNoLoadBalanceConfig )</li>
</ul>
</li>
<li>分布式消息队列 - Kafka<ul>
<li>在多个配置文件中都配置了Kafka相关参数</li>
<li>用于系统间的数据传输和事件驱动</li>
</ul>
</li>
<li>分布式任务调度 - XXL-Job<ul>
<li>项目包含了 tomm-xxl-job-admin 模块</li>
<li>用于管理和调度分布式任务</li>
</ul>
</li>
<li>分布式缓存和锁 - Redis/Redisson<ul>
<li>使用Redisson客户端操作Redis</li>
<li>实现分布式锁、分布式限流等功能</li>
</ul>
</li>
<li>分布式日志追踪 - TLog<ul>
<li>支持分布式链路日志记录和追踪</li>
</ul>
</li>
<li>服务监控 - Spring Boot Admin<ul>
<li>用于监控各个服务的运行状态</li>
</ul>
</li>
</ol>
<p><strong>缺少的典型微服务组件。</strong></p>
<p>项目中没有发现以下典型的微服务核心组件：</p>
<ol>
<li>服务注册与发现 ：没有使用Eureka、Nacos、Consul或Zookeeper等</li>
<li>配置中心 ：没有使用Spring Cloud Config或Nacos Config等</li>
<li>API网关 ：没有使用Spring Cloud Gateway或Zuul等</li>
<li>服务熔断和限流 ：没有使用Sentinel、Hystrix或Resilience4j等</li>
</ol>
<p><strong>项目架构特点：</strong></p>
<ol>
<li>多模块单体架构 ：虽然项目分为多个模块(tomm-admin、tomm-system、tomm-common等)，但这些更像是功能模块的划分，而非独立部署的微服务</li>
<li>分布式能力增强 ：项目集成了多种分布式系统常用组件，具备一定的分布式处理能力</li>
<li>动态服务调用 ：通过动态Feign客户端，可以灵活调用不同的外部服务</li>
<li>容器化支持 ：提供了Docker和Docker Compose配置，支持容器化部署</li>
<li>数据库集群支持 ：支持多种数据库，具备处理大数据量的能力<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2>该项目是一个增强型的单体应用 ，它采用了多模块的结构设计，并集成了多种分布式系统的常用组件，以提高系统的可靠性、可扩展性和维护性。虽然它没有完整的微服务架构，但已经具备了一些微服务的特性和能力。这种架构适合业务相对稳定、团队规模适中的项目，可以在保持开发效率的同时，为未来可能的微服务拆分打下基础。</li>
</ol>
<blockquote>
<p>2025 年 11 月 11 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10080/">http://101.227.48.102:10080/</a></p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10080/tangxinghua/tomm-mgt-server/-/tree/feature-v2">http://101.227.48.102:10080/tangxinghua/tomm-mgt-server/-/tree/feature-v2</a></p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10003/newNetworkedTollCollection">高速公路联网收费运行监测管理平台 - 大屏</a></p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10003/examine/examine">高速公路联网收费运行监测管理平台 - 后台管理</a></p>
<p>指定拉取 feature-v2 分支：</p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">export GIT_SSL_NO_VERIFY=true<br>git clone -b feature-v2 http:<span class="hljs-regexp">//</span><span class="hljs-number">101.227</span>.<span class="hljs-number">48.102</span>:<span class="hljs-number">10080</span><span class="hljs-regexp">/tangxinghua/</span>tomm-mgt-server.git<br></code></pre></td></tr></table></figure>

<figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">dengrui1<br><span class="hljs-symbol">Dr@</span><span class="hljs-number">20251107</span><br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251111145555202.png" alt="image-20251111145555202"></p>
<p>这四个项目构成了一个从<strong>数据采集 -&gt; 智能分析 -&gt; 综合管理 -&gt; 场景应用</strong>的完整闭环：</p>
<ol>
<li><strong>gantry-sync-server</strong> 是<strong>数据源头</strong>，负责采集门架基础数据。</li>
<li><strong>tomm-aiops-server</strong> 是<strong>智慧引擎</strong>，对数据进行分析，产生智能洞察。</li>
<li><strong>tomm-mgt-server</strong> 是<strong>指挥中心</strong>，基于洞察进行全面的运维决策和管理。</li>
<li><strong>tomm-rmgt-server</strong> 是<strong>前线哨所</strong>，在路段层面提供具体的监控视图和操作界面。</li>
</ol>
<p>看会儿前端代码。</p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-comment"># 若依管理系统/开发环境</span><br><span class="hljs-attr">VUE_APP_BASE_API</span> = <span class="hljs-string">&#x27;/dev-api&#x27;</span><br><br><span class="hljs-comment"># 应用访问路径 例如使用前缀 /admin/</span><br><span class="hljs-attr">VUE_APP_CONTEXT_PATH</span> = <span class="hljs-string">&#x27;/&#x27;</span><br><br><span class="hljs-comment"># 监控地址</span><br><span class="hljs-attr">VUE_APP_MONITRO_ADMIN</span> = <span class="hljs-string">&#x27;http://localhost:9090/admin/login&#x27;</span><br><br><span class="hljs-comment"># xxl-job 控制台地址</span><br><span class="hljs-attr">VUE_APP_XXL_JOB_ADMIN</span> = <span class="hljs-string">&#x27;http://localhost:9100/xxl-job-admin&#x27;</span><br></code></pre></td></tr></table></figure>

<p>把安装部署搞定，尝试把前后端项目部署并成功访问，再研究下核心业务逻辑。</p>
<blockquote>
<p>2025 年 11 月 10 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/30946726043">(99+ 封私信 / 82 条消息) ERP、OA、CRM到底啥区别？90% 的企业选错了，别再踩坑！ - 知乎</a></p>
<p><strong>ERP（企业资源计划）</strong>，<strong>OA（办公自动化）</strong>，<strong>CRM（客户关系管理）</strong>。</p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10003/indexmonitor">高速公路联网收费运行监测管理平台</a></p>
<p>大屏调用接口。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 大屏显示的接口 Controller</span><br><span class="hljs-comment"> */</span><br><span class="hljs-meta">@Tag(name = &quot;大屏显示的接口&quot;)</span><br><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(&quot;/big_screen_displa&quot;)</span><br><span class="hljs-meta">@Anonymous</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">BigScreenDisplaController</span><br></code></pre></td></tr></table></figure>

<p>资产中心。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 登录验证</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> Lion Li</span><br><span class="hljs-comment"> */</span><br><span class="hljs-meta">@Validated</span><br><span class="hljs-meta">@RequiredArgsConstructor</span><br><span class="hljs-meta">@RestController</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">SysLoginController</span> <br></code></pre></td></tr></table></figure>

<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment">     * 获取路由信息</span><br><span class="hljs-comment">     *</span><br><span class="hljs-comment">     * <span class="hljs-doctag">@return</span> 路由信息</span><br><span class="hljs-comment">     */</span><br>    <span class="hljs-meta">@GetMapping(&quot;getRouters&quot;)</span><br>    <span class="hljs-keyword">public</span> R&lt;List&lt;RouterVo&gt;&gt; <span class="hljs-title function_">getRouters</span><span class="hljs-params">(Long type)</span><br></code></pre></td></tr></table></figure>

<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 资产 Controller</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> zhanghuimin</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@date</span> 2025-08-14</span><br><span class="hljs-comment"> */</span><br><span class="hljs-meta">@Tag(name = &quot;资产 Controller&quot;)</span><br><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(&quot;v2/asset&quot;)</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">AssetController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">BaseController</span><br></code></pre></td></tr></table></figure>

<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 资产类型 Controller</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> zhanghuimin</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@date</span> 2025-08-14</span><br><span class="hljs-comment"> */</span><br><span class="hljs-meta">@Tag(name = &quot;资产类型 Controller&quot;)</span><br><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(&quot;v2/asset_type&quot;)</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">AssetTypeController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">BaseController</span><br></code></pre></td></tr></table></figure>

<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 部门信息</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> Lion Li</span><br><span class="hljs-comment"> */</span><br><span class="hljs-meta">@Validated</span><br><span class="hljs-meta">@RequiredArgsConstructor</span><br><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(&quot;/system/dept&quot;)</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">SysDeptController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">BaseController</span><br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">http:<span class="hljs-regexp">//</span><span class="hljs-number">101.227</span>.<span class="hljs-number">48.102</span>:<span class="hljs-number">10003</span><span class="hljs-regexp">/dev-api/</span>system<span class="hljs-regexp">/dept/</span>v2/list<br></code></pre></td></tr></table></figure>

<p>今天的任务，在本地把项目跑起来，再根据安装部署手册初步尝试在本地虚拟机安装基础环境。</p>
<p>业务逻辑的话，稍后放一放，姜总说业务和技术也不复杂，多的是查询接口。</p>
<p>本地启动 tmmo-admin 模块。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">import</span> sun.font.FontDesignMetrics;<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">D:\Project\luofeng\tomm-mgt-server-feature-v2\tomm-common\src\main\java\com\tomm\common\utils\QRCodeUtil1.java:11:16<br>java: 程序包sun.font不存在<br></code></pre></td></tr></table></figure>

<p>出现这个错误，把 JDK 换成 jDK8 即可。</p>
<figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs subunit"><span class="hljs-keyword">Error </span>running &#x27;TommApplication&#x27; Error running TommApplication. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun<br></code></pre></td></tr></table></figure>

<p>在启动 <code>TommApplication</code>时遇到了 “Command line is too long” 的错误。这是一个在Windows系统上使用IntelliJ IDEA开发大型Java项目时常见的问题，主要是因为项目的类路径（classpath）过长，超过了操作系统允许的命令行长度限制。</p>
<p><img src="http://blog.memory-life.xyz/image-20251110165217191.png" alt="image-20251110165217191"></p>
<p><strong>打开运行/调试配置</strong>在IDEA顶部工具栏，找到并点击当前显示为 <code>TommApplication</code>的运行/调试配置下拉菜单，然后选择 <strong><code>Edit Configurations...</code><strong>。在配置窗口中，找到并点击 <strong><code>Modify options</code></strong> 按钮，在展开的菜单列表中，勾选 <strong><code>Shorten command line</code></strong> 选项</strong>启用缩短命令行功能</strong></p>
<p>完成上一步后，配置界面下方会出现一个名为 <strong><code>Shorten command line</code></strong> 的新下拉菜单。点击它，您会看到两个选择：</p>
<ul>
<li>**<code>JAR manifest</code>**：IDEA会创建一个临时的JAR文件，并将冗长的类路径信息写入其清单文件（MANIFEST.MF）中。这是常用的方法。</li>
<li>**<code>classpath file</code>**：IDEA会创建一个文本文件来存储类路径，然后在启动命令中引用该文件。</li>
</ul>
<p><strong>保存配置，重启应用。</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">2025-11-10 16:55:20 [main] ERROR o.s.boot.SpringApplication<br> - Application run failed<br>org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.tomm.TommApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name <span class="hljs-string">&#x27;TMessageTemplateController&#x27;</span> <span class="hljs-keyword">for</span> bean class [com.tomm.web.controller.BaseData.TMessageTemplateController] conflicts with existing, non-compatible bean definition of same name and class [com.tomm.system.controller.TMessageTemplateController]<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">Caused by: java.lang.IllegalStateException: either <span class="hljs-string">&#x27;jasypt.encryptor.password&#x27;</span> or one of [<span class="hljs-string">&#x27;jasypt.encryptor.private-key-string&#x27;</span>, <span class="hljs-string">&#x27;jasypt.encryptor.private-key-location&#x27;</span>] must be provided <span class="hljs-keyword">for</span> Password-based or Asymmetric encryption<br></code></pre></td></tr></table></figure>

<p>这表明应用程序使用了 Jasypt 进行配置加密，但在启动时缺少必要的加密密钥配置。</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">spring:</span><br>  <span class="hljs-attr">redis:</span><br>    <span class="hljs-comment"># 地址</span><br>    <span class="hljs-attr">host:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><br>    <span class="hljs-comment">#host: 124.71.226.0</span><br>    <span class="hljs-comment"># 端口，默认为6379</span><br>    <span class="hljs-attr">port:</span> <span class="hljs-number">6379</span><br>    <span class="hljs-comment">#port: 9088</span><br>    <span class="hljs-comment"># 数据库索引</span><br>    <span class="hljs-attr">database:</span> <span class="hljs-number">0</span><br>    <span class="hljs-comment"># 密码(如没有密码请注释掉)</span><br><span class="hljs-comment">#    password: ENC(BYh3oiwHYjDezan9szQTDu16MB0LcHGM)</span><br></code></pre></td></tr></table></figure>

<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">jasypt:</span><br>  <span class="hljs-attr">encryptor:</span><br>    <span class="hljs-attr">password:</span> <span class="hljs-string">lybgeek</span><br>    <span class="hljs-attr">algorithm:</span> <span class="hljs-string">PBEWithMD5AndDES</span><br>    <span class="hljs-attr">iv-generator-classname:</span> <span class="hljs-string">org.jasypt.iv.NoIvGenerator</span><br></code></pre></td></tr></table></figure>

<p>直接改这个配置：</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">profiles:</span><br>  <span class="hljs-attr">active:</span> <span class="hljs-string">dev</span><br></code></pre></td></tr></table></figure>

<p>TommApplication 应用成功启动。</p>
<p>启动 DataCollectionApplication，出现：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">RedisConnectionException: Unable to connect to Redis server: 101.227.50.186/101.227.50.186:6379<br>ConnectTimeoutException: connection timed out: 101.227.50.186/101.227.50.186:6379<br></code></pre></td></tr></table></figure>

<p>错误原因是应用程序无法连接到指定的Redis服务器。</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-string">---</span> <span class="hljs-comment"># redis 单机配置(单机与集群只能开启一个另一个需要注释掉)</span><br><span class="hljs-attr">spring:</span><br>  <span class="hljs-attr">redis:</span><br>    <span class="hljs-comment"># 地址</span><br>    <span class="hljs-attr">host:</span> <span class="hljs-number">101.227</span><span class="hljs-number">.50</span><span class="hljs-number">.186</span><br>    <span class="hljs-comment">#host: 124.71.226.0</span><br>    <span class="hljs-comment"># 端口，默认为6379</span><br>    <span class="hljs-attr">port:</span> <span class="hljs-number">6379</span><br>    <span class="hljs-comment">#port: 9088</span><br>    <span class="hljs-comment"># 数据库索引</span><br>    <span class="hljs-attr">database:</span> <span class="hljs-number">0</span><br>    <span class="hljs-comment"># 密码(如没有密码请注释掉)</span><br>    <span class="hljs-comment">#password: 123456</span><br>    <span class="hljs-comment">#password: ssljtzzh</span><br>    <span class="hljs-attr">password:</span> <span class="hljs-string">ENC(G2lSweX0Vk/aZP42SIaKqYPtv4jYjcWa)</span><br>    <span class="hljs-comment"># 连接超时时间</span><br>    <span class="hljs-attr">timeout:</span> <span class="hljs-string">10s</span><br>    <span class="hljs-comment"># 是否开启ssl</span><br>    <span class="hljs-attr">ssl:</span> <span class="hljs-literal">false</span><br></code></pre></td></tr></table></figure>

<p>直接连接本地 Redis，也不行，这应该是远程 Redis 服务器出现问题了，先不用管。</p>
<p>顺利启动 MonitorAdminApplication 和 XxlJobAdminApplication 应用。</p>
<h2 id="大屏"><a href="#大屏" class="headerlink" title="大屏"></a>大屏</h2><blockquote>
<p>2025 年 11 月 5 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10003/newNetworkedTollCollection">高速公路联网收费运行监测管理平台</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251105092910030.png" alt="image-20251105092910030"></p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10003/overview">高速公路联网收费运行监测管理平台</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251105093003797.png" alt="image-20251105093003797"></p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzIzNzMzOTg4MA==&mid=2247536446&idx=1&sn=010bc7c1ecd0ceefdccf81818d752fb0&chksm=e8c81ab9dfbf93af9714a34796e5a30d7eaa3cd6c51ca3f28ccea28fabccdc2e96726455ff9e&scene=27">让高速更“高速”！四川成雅高速试点自由流ETC门架</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">收费站，门架<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1841791328576143236&wfr=spider&for=pc">高速公路龙门架收费详解与未来展望</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">“龙门架分段式收费”是一种高速公路收费模式。龙门架，作为布设在两个相邻收费站之间的设备，主要负责计算收费金额和扣费。这种分段收费的方式，是将高速公路依据相邻的互通立交、入/出口收费站划分为若干个独立的收费区间，每个区间都会独立计算费额。而ETC门架的名称，通常以收费区间两端连接点的名称来命名，例如“花城大道-黄埔大道”。<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">图中所示即为龙门架，它会在车辆经过时自动记录行车路径与时间，进而生成详细的通行流水。在收费站出口处，通常只会显示最后一个匝道的费用情况。若该匝道不收费，则显示为0元；若应收费，则显示相应的匝道费额，客户所见的收费记录即为该费用。<br></code></pre></td></tr></table></figure>

<p><strong>ETC车辆通过龙门架时，其收费金额是根据相邻两个收费站的里程、车型对应的收费标准以及折扣优惠来计算的</strong>，最终按照“四舍五入”的规则精确到“分”。</p>
<p>对于<strong>人工收费车辆</strong>，则使用CPC卡来记录行车路径，采用分段计费的方式，在出口合并收费，并同样遵循“四舍五入”的规则取整至“元”。</p>
<p>高速收费模式。</p>
<p><a target="_blank" rel="noopener" href="https://m.thepaper.cn/baijiahao_3967157">首座ETC门架亮相！淮南人路过这里会发现！</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1826182723418214317&wfr=spider&for=pc">高速龙门架激增，你了解ETC门架的双重功能吗</a></p>
<p><a target="_blank" rel="noopener" href="https://m.thepaper.cn/baijiahao_4250673">鼓掌！我省正在运营高速首个ETC门架安装完成！（内附视频）</a></p>
<p>刚连上数字公司 WIFI 的时候进不了这个系统，现在把手机热点关了连数字公司也行了，省点自己的流量。</p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/644761491">(99+ 封私信 / 82 条消息) 高速记费门架上，悬挂“不抓拍违章”醒目标牌，这么做的目的是什么？ - 知乎</a></p>
<p>门架的服务器，工控机还有机柜是什么东西？</p>
<p>三者的关系与协同工作流程</p>
<p>我们可以通过一个简单的流程来理解它们如何协同工作：</p>
<ol>
<li><strong>车辆通行</strong>：一辆装有ETC设备的汽车通过收费门架。</li>
<li><strong>数据采集</strong>：门架上的RSU天线与车辆OBU进行通信，完成交易；摄像机抓拍车辆图像和车牌信息。</li>
<li><strong>边缘处理（工控机）</strong>：每个车道的工控机实时处理本车道设备采集的数据，并生成一条原始的通行记录。</li>
<li><strong>数据汇聚（门架服务器）</strong>：所有车道的工控机将通行记录上传至安装在<strong>机柜</strong>内的<strong>门架服务器</strong>。</li>
<li><strong>存储与上传</strong>：门架服务器将所有数据整合、存储，然后通过通信网络实时上传至省级联网中心平台，用于后台计费、清分结算和运行监测。</li>
<li><strong>物理保障（机柜）</strong>：在整个过程中，<strong>机柜</strong>为内部的<strong>工控机</strong>和<strong>门架服务器</strong>提供了一个安全、稳定、适宜的运行环境。</li>
</ol>
<p>省中心，路段公司还有收费站三者之间有什么关系？</p>
<p>所以，它们三者的关系是：</p>
<ul>
<li><strong>收费站</strong>向 <strong>路段公司</strong>负责，是收入的直接“采集器”。</li>
<li><strong>路段公司</strong>向 <strong>省中心</strong>负责，是具体业务的“经营者”和“执行者”。</li>
<li><strong>省中心</strong>对所有 <strong>路段公司</strong>和 <strong>收费站</strong>进行管理和协调，是规则的“制定者”和资金的“清算者”。</li>
</ul>
<p>保存下大屏页面截图。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">同事让我研究下高速公路联网收费运行监测管理平台，以及对应的大屏。你就是最红我有些东西确实不太明确，不过你从这个系统中可以告我些什么信息呢。<br></code></pre></td></tr></table></figure>

<p>这个项目一期二期在指什么？</p>
<p>根据您之前提供的平台信息，同事口中的“一期、二期”很可能指：</p>
<ul>
<li><strong>一期</strong>：指当前已经上线的这个<strong>高速公路联网收费运行监测管理平台</strong>本身，它实现了对全省路网、设备、收费业务的初步集中监测和告警。</li>
<li><strong>二期</strong>：可能是在讨论<strong>下一步的升级计划</strong>。例如：“二期我们准备把所有的门架设备监控也接进来。”“这个AI分析功能得等到二期才能开发。”“目前大屏显示的是基础数据，二期的可视化效果会更棒。”</li>
</ul>
<p>作为后台开发人员，在这份工作中，我可能会负责什么样的任务？</p>
<p>你的工作虽然不在收费一线，但却是整个收费系统的大脑和心脏。你每天打交道的主要是<strong>服务器、数据库、数据流水、业务参数</strong>。你的核心价值在于<strong>保障资金准确、保障系统稳定、保障规则生效、保障数据有用</strong>。</p>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2537165">智慧收费 | 高速公路联网收费运行态势智慧感知系统研究及应用-腾讯云开发者社区-腾讯云</a></p>
<p>公路收费系统。</p>
<figure class="highlight prolog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs prolog">公路收费系统采用省收费中心、路段分中心、收费站的三级管理体制 [<span class="hljs-number">1</span>]。底层车道系统具备车型判别、信息校验、计费核算功能，支持<span class="hljs-symbol">ETC</span>、移动支付等自动缴费方式。收费站系统负责数据查询、票据管理及图像稽查，并向下辖车道终端传输基础参数。省级联网中心通过<span class="hljs-string">&quot;芸路通&quot;</span><span class="hljs-string">&quot;芸数聚&quot;</span>等平台实现全路网数据汇总与通行费拆分结算。<br></code></pre></td></tr></table></figure>

<p>公路收费系统是基于信息技术实现道路通行费征收管理的专业化软件体系，其建设与推广受国务院深化收费公路制度改革部署推动。系统通过车道终端设备、收费站管理平台及省级联网系统的三级架构，集成ETC电子不停车收费、移动支付、车牌识别等技术手段，有效提升通行效率并降低运营成本。截至2019年底，全国已实现ETC用户突破1.8亿、货车不停车收费等政策目标，人工车道全面支持移动支付方式 [1]。杭州恒生芸擎、北京捷迅贵德等企业开发的收费系统解决方案，采用”云 边 端”架构与智能分析技术，在浙江等省份实现高效处理能力。</p>
<p>中午十二点吃个饱饭，睡了二十分钟到两点十分醒来。</p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7504491526363856934">Jetbrains正式宣布免费，有点猛啊！提到 Jetbrains 这家公司，相信搞开发的同学应该都不陌生。 该公司盛产 - 掘金</a></p>
<h2 id="软考"><a href="#软考" class="headerlink" title="软考"></a>软考</h2><blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://www.ruankao.org.cn/article/content/2502121040396048212475606.html">中国计算机技术职业资格网</a></p>
<p><a target="_blank" rel="noopener" href="https://www.educity.cn/">希赛网_专注在线职业教育24年</a></p>
<p>明年上半年可以考<strong>信息系统项目管理师</strong>高项，明年下半年可以考<strong>系统架构设计师</strong>高项，计划用一年的时间拿下两本软考高级证书。</p>
<p>中级暂不考虑，已经有<strong>软件设计师</strong>中项了，</p>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E7%A7%AF%E5%88%86%E5%85%A5%E6%88%B7/6306472">积分入户_百度百科</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">积分入户是中国部分城市基于积分指标体系审核外来务工人员落户资格的户籍管理政策。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/1924035980509287457">(99+ 封私信 / 82 条消息) 信息系统项目管理师证书（高项）有什么用？ - 知乎</a></p>
<h2 id="端口超限"><a href="#端口超限" class="headerlink" title="端口超限"></a>端口超限</h2><blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10080/">http://101.227.48.102:10080/</a></p>
<p><a target="_blank" rel="noopener" href="http://101.227.48.102:10080/tangxinghua/tomm-mgt-server/-/tree/feature-v2">http://101.227.48.102:10080/tangxinghua/tomm-mgt-server/-/tree/feature-v2</a></p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs awk">Lenovo@LAPTOP-<span class="hljs-number">5</span>U3S75BI MINGW64 <span class="hljs-regexp">/d/</span>桌面/新建文件夹<br>$ git clone http:<span class="hljs-regexp">//</span><span class="hljs-number">101.227</span>.<span class="hljs-number">48.102</span>:<span class="hljs-number">10080</span><span class="hljs-regexp">/tangxinghua/</span>tomm-mgt-server<span class="hljs-regexp">/-/</span>tree/feature-v2<br>Cloning into <span class="hljs-string">&#x27;feature-v2&#x27;</span>...<br>fatal: unable to update url base from redirection:<br>  asked <span class="hljs-keyword">for</span>: http:<span class="hljs-regexp">//</span><span class="hljs-number">101.227</span>.<span class="hljs-number">48.102</span>:<span class="hljs-number">10080</span><span class="hljs-regexp">/tangxinghua/</span>tomm-mgt-server<span class="hljs-regexp">/-/</span>tree<span class="hljs-regexp">/feature-v2/i</span>nfo/refs?service=git-upload-pack<br>   redirect: http:<span class="hljs-regexp">//</span><span class="hljs-number">101.227</span>.<span class="hljs-number">48.102</span>:<span class="hljs-number">10080</span><span class="hljs-regexp">/users/</span>sign_in<br></code></pre></td></tr></table></figure>

<figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">dengrui1<br><span class="hljs-symbol">Dr@</span><span class="hljs-number">20251107</span><br></code></pre></td></tr></table></figure>

<p>这样直接拉取确实能拉取成功，不过为什么只拉下来个README.md文件呢。。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">export</span> GIT_SSL_NO_VERIFY=<span class="hljs-literal">true</span><br>git <span class="hljs-built_in">clone</span> http://101.227.48.102:10080/tangxinghua/tomm-mgt-server.git<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">export</span> GIT_SSL_NO_VERIFY=<span class="hljs-literal">true</span><br>git <span class="hljs-built_in">clone</span> http://101.227.48.102:10080/tangxinghua/tomm-mgt-server.git<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">http://101.227.48.102:10080/tangxinghua/tomm-mgt-server/-/tree/feature-v2.git<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/lxy123_com/article/details/120285742">解决火狐浏览器的（此网址已被限制，此网址使用了一个通常用于网络浏览以外目的的端口，出于安全原因，Firefox 取消了该请求）问题_火狐此计算机已取消连接-CSDN博客</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">此网址已被限制，此网址使用了一个通常用于网络浏览以外目的的端口，出于安全原因，Firefox 取消了该请求<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251107163135662.png" alt="image-20251107163135662"></p>
<p>解决方案：</p>
<p>1、在火狐浏览器中输入 about:config</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript"><span class="hljs-keyword">about</span>:config<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251107163308546.png" alt="image-20251107163308546"></p>
<p>2、在搜索首选项中输入 network.security.ports.banned.override</p>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">network<span class="hljs-selector-class">.security</span><span class="hljs-selector-class">.ports</span><span class="hljs-selector-class">.banned</span>.override<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251107163210956.png" alt="image-20251107163210956"></p>
<p>其中，设置开放端口可以使用，来分隔多个端口；使用-表示一个开放端口范围。</p>
<p>3、测试，访问 <a target="_blank" rel="noopener" href="http://101.227.48.102:10080/%E3%80%82">http://101.227.48.102:10080/。</a></p>
<p><img src="http://blog.memory-life.xyz/image-20251107163534922.png" alt="image-20251107163534922"></p>
<p><img src="http://blog.memory-life.xyz/image-20251107163553147.png" alt="image-20251107163553147"></p>
<p>其实解决方案 DeepSeek 刚刚已经讲明白了，只不过没图没指导完全没看懂在干什么。</p>
<p>解决方法：修改 Firefox 配置</p>
<p>请严格按照以下步骤操作：</p>
<p><strong>第一步：打开 Firefox 配置编辑器</strong></p>
<ol>
<li>在 Firefox 地址栏中，输入 <code>about:config</code>然后按 Enter。</li>
<li>您会看到一个警告页面，提示“这会失去保修！”或类似内容。点击 <strong>“接受风险并继续”</strong>。</li>
</ol>
<p><strong>第二步：修改安全配置</strong></p>
<ol>
<li>在顶部的搜索栏中，搜索 <code>security.ports</code>。</li>
<li>这会过滤出与端口限制相关的配置项。我们需要修改的是 <code>security.ports.banned.override</code>。</li>
<li><strong>双击</strong> <code>security.ports.banned.override</code>这一项。</li>
<li>会弹出一个对话框让你输入字符串值。</li>
<li>在输入框中，填入您需要解除限制的端口号 <code>10080</code>。如果您需要允许多个端口，用英文逗号分隔，例如：<code>10080,8081,9000</code>。</li>
<li>点击 <strong>“确定”</strong>。</li>
</ol>
<p><strong>第三步：刷新页面或重新访问网址</strong></p>
<p>现在，回到之前被阻止的标签页，<strong>刷新页面</strong>，或者在新标签页中重新输入网址 <code>http://101.227.48.102:10080</code>。您现在应该可以正常访问该代码仓库了。S</p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDhWwnOcW2CD7mkj08pnmAxQuPvEoBCIo4lwofyh5Gnf4rrrmL5a1dvilwGxVuSNRCTpdCcwU7gire7ira4kiyu1xrPY21H77jC8hmOkYwJ<span class="hljs-regexp">/xFHs9j3uO2qdv6vk3nzMian8ahiN7EgVDBColQVTPMt0zM33sFaP4X6dvqsMwgDZWbgzbViqo7MDWNvyaCZlb14YSeDQZ4K5oQGyzj5jhLNV/</span>D2PqvSiA4MKiPwMlUMZvuS0NmZWBqoFIbVXeQ21t0ZzIlse+<span class="hljs-number">5</span>ogwki0yAJd1mgInAlyEvYYoDNBvNFgjOyHJ9Rc0LbtIQASu90oap9vXdb2AEOZ0cgDaeeISxUrsmc9N<span class="hljs-regexp">/Sc8La49SHBgazO9ClMq84cyBKECzRo6iHh6SjNGsKNdTdiSuzgO7SUrUQ+mGBBSIyKpuGJ3mhlS6ewzRTq3iC1cZoUzl1VD4/</span>Buvxds2BIEVSLzfsqC+/RG8rFc7PFo005eFF9d09INoT8Woype59norGGkWikVodAHYlJUs= Lenovo@LAPTOP-<span class="hljs-number">5</span>U3S75BI<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251107165634405.png" alt="image-20251107165634405"></p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># 生成新的 ED25519 密钥（推荐）</span><br>ssh-keygen -t ed25519 -C <span class="hljs-string">&quot;your_email@example.com&quot;</span> -f ~<span class="hljs-regexp">/.ssh/i</span>d_ed25519_gitlab<br><br><span class="hljs-comment"># 或者生成 RSA 密钥</span><br>ssh-keygen -t rsa -b <span class="hljs-number">4096</span> -C <span class="hljs-string">&quot;your_email@example.com&quot;</span> -f ~<span class="hljs-regexp">/.ssh/i</span>d_rsa_gitlab<br></code></pre></td></tr></table></figure>

<p>执行这个，强制指定生成新密钥后的存放路径。</p>
<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-variable">ssh</span><span class="hljs-operator">-</span><span class="hljs-variable">keygen</span> <span class="hljs-operator">-</span><span class="hljs-variable">t</span> <span class="hljs-variable">ed25519</span> <span class="hljs-operator">-</span><span class="hljs-built_in">C</span> <span class="hljs-string">&quot;dengwei@dengwei.com&quot;</span> <span class="hljs-operator">-</span><span class="hljs-variable">f</span> <span class="hljs-built_in">C</span><span class="hljs-operator">:</span>\<span class="hljs-variable">Users</span>\<span class="hljs-variable">Lenovo</span>\<span class="hljs-operator">.</span><span class="hljs-variable">ssh</span>\<span class="hljs-type">id_ed25519</span><span class="hljs-type">_gitlab</span><br></code></pre></td></tr></table></figure>

<p>生成成功，Gitlab 平台添加 SSH 密钥成功。</p>
<figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFyb7N7m7i2AY301bcIiPO7QkBgDAnR1H/<span class="hljs-number">7</span>dVrlQw9K1 <span class="hljs-symbol">dengwei@</span>dengwei.com<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251107170410740.png" alt="image-20251107170410740"></p>
<p><img src="http://blog.memory-life.xyz/image-20251107170441481.png" alt="image-20251107170441481"></p>
<p><strong>测试连接</strong>：</p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">ssh</span> -T git@<span class="hljs-number">101.227.48.102</span><br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">为什么这么干了，拉取时还是要求我输入密码啊，<br></code></pre></td></tr></table></figure>

<p><strong>首先验证 SSH 密钥是否正确加载</strong></p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-comment"># 查看 SSH 代理中是否有您的密钥</span><br>ssh-<span class="hljs-built_in">add</span> -l<br><br><span class="hljs-comment"># 如果没有显示您的密钥，手动添加</span><br>ssh-<span class="hljs-built_in">add</span> C:\Users\Lenovo\.ssh\id_ed25519_gitlab  # 替换为您的私钥文件路径<br></code></pre></td></tr></table></figure>

<p>出现错误：</p>
<figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs subunit">C:\WINDOWS\system32&gt;ssh-add -l<br><span class="hljs-keyword">Error </span>connecting to agent: No such file or directory<br></code></pre></td></tr></table></figure>

<p>这个错误表明 <strong>SSH 代理没有运行</strong>。在 Windows 系统中，SSH 代理的管理方式与 Linux/Mac 不同。</p>
<p>Windows 系统下的 SSH 代理管理，使用 Git Bash：</p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-comment"># 在 Git Bash 中执行（不是 CMD）</span><br>eval <span class="hljs-string">&quot;<span class="hljs-variable">$(ssh-agent -s)</span>&quot;</span><br>ssh-<span class="hljs-built_in">add</span> C:\Users\Lenovo\.ssh\id_ed25519_gitlab<br>ssh-<span class="hljs-built_in">add</span> -l<br></code></pre></td></tr></table></figure>

<p>依次执行命令。</p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs gradle">Lenovo@LAPTOP-<span class="hljs-number">5</span>U3S75BI MINGW64 <span class="hljs-regexp">/d/</span><span class="hljs-keyword">Project</span>/luofeng<br>$ ssh-add -l<br>The agent has no identities.<br></code></pre></td></tr></table></figure>

<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs css">Lenovo<span class="hljs-keyword">@LAPTOP-5U3S75BI</span> MINGW64 /d/Project/luofeng<br>$ ssh-add <span class="hljs-attribute">C</span>:\Users\Lenovo\.ssh\id_ed25519_gitlab<br><span class="hljs-attribute">C</span>:UsersLenovo.sshid_ed25519_<span class="hljs-attribute">gitlab</span>: No such file <span class="hljs-keyword">or</span> directory<br></code></pre></td></tr></table></figure>

<figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs gradle">Lenovo@LAPTOP-<span class="hljs-number">5</span>U3S75BI MINGW64 <span class="hljs-regexp">/d/</span><span class="hljs-keyword">Project</span>/luofeng<br>$ ssh-add C:<span class="hljs-regexp">/Users/</span>Lenovo<span class="hljs-regexp">/.ssh/i</span>d_ed25519_gitlab<br>Identity added: C:<span class="hljs-regexp">/Users/</span>Lenovo<span class="hljs-regexp">/.ssh/i</span>d_ed25519_gitlab (dengwei@dengwei.com)<br></code></pre></td></tr></table></figure>

<p>还是不行。。</p>
<p>拉取 Gitee 代码就没有什么问题，这个 Gitlab 平台反复配置完毕 SSH 密钥，在拉取仓库代码时还是提示要求输入密码。</p>
<p>直接下载压缩包吧。</p>
<p>代码看到了，但 maven 仓库还没给配。</p>
<h2 id="美元"><a href="#美元" class="headerlink" title="美元"></a>美元</h2><blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1842570871317777384&wfr=spider&for=pc">人民币购买力竟超美元，生活成本差距惊人，真相让人震惊</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1845269772373324605&wfr=spider&for=pc">美元和人民币之间的实际购买力按盒饭算美元</a></p>
<h2 id="USB"><a href="#USB" class="headerlink" title="USB"></a>USB</h2><blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<p>[USB Type-C_百度百科](<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/USB">https://baike.baidu.com/item/USB</a> Type-C/16565059)</p>
<p><a target="_blank" rel="noopener" href="https://image.baidu.com/search/detail?ct=503316480&z=0&tn=baiduimagedetail&ipn=d&cl=2&cm=1&sc=0&sa=vs_ala_img_datu&lm=-1&ie=utf8&pn=6&rn=1&di=7562963243866521601&ln=0&word=usb-a%E5%92%8Cusb-b%E5%92%8Cusb-c&os=2366036496,3879205524&cs=2890362460,2346737198&objurl=http://pic.rmb.bdstatic.com/bjh/down/9f98f0f48ebd9d91e9b9a65f14397062.jpeg&bdtype=0&simid=2890362460,2346737198&pi=0&adpicid=0&timingneed=&spn=0&is=0,0&lid=c8d855d00191378d">usb-a和usb-b和usb-c的搜索结果_百度图片搜索</a></p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">DP</span>输出指的是DisplayPort接口的输出功。DisplayPort是由PC及芯片制造商联盟开发，视频电子标准协会标准化的数字式视频接口标准，支持高分辨率、高刷新率和高动态范围技术，如<span class="hljs-number">4</span>K、<span class="hljs-number">8</span>K等。与HDMI相比，DP具有更高带宽和免费协议等优势。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1830653887090766247&wfr=spider&for=pc">显示器DP接口和HDMI有什么区别？详细对比一看就懂！</a></p>
<p>DP 接口和 HDMI 接口。</p>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">USB 全称为 Universal <span class="hljs-built_in">Serial</span> Bus，翻译过来就是通用串行总线，由英特尔与众多电脑公司提出来用于规范电脑与外部设备的连接与通讯。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/690772582">(99+ 封私信 / 82 条消息) usb的学习一 - 知乎</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/2401_87555420/article/details/143593171">USB接口那么多！！你都认识吗？？知道他们的区别吗？？_mirco b与 usb a_usb接口有几种-CSDN博客</a></p>
<p>USB Type-A，USB Type–B，USB-Type C 接口。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/zhengaga/article/details/139484804">分清楚各式各样的USB接口！一帖搞定_usb-a接口-CSDN博客</a></p>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">USB：Universal <span class="hljs-built_in">Serial</span> Bus，通用串行总线。<br></code></pre></td></tr></table></figure>

<p><strong>USB：</strong>Universal Serial Bus，通用串行总线。</p>
<p><strong>HDMI：</strong>High Definition Multimedia Interface，高清多媒体接口。</p>
<p><strong>DP：</strong>DisplayPort，数字式视频接口标准。DP在这几年也逐渐流行起来了，它是一个由PC及芯片制造商联盟开发，视频电子标准协会（VESA）标准化的数字式视频接口标准，DP 的功能和 HDMI 非常相似，主要用于视频传输。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/ybhuangfugui/article/details/125550795">电脑USB、HDMI、DP各种接口及速度-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/1941781922348012720">(99+ 封私信 / 82 条消息) 一文看懂显示接口：HDMI / DP / VGA / USB-C 有什么区别？怎么选？ - 知乎</a></p>
<h2 id="银行卡"><a href="#银行卡" class="headerlink" title="银行卡"></a>银行卡</h2><blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1716954633321780229&wfr=spider&for=pc">别再纠结了！社保卡的所属银行是哪个？4种方式都可以查询</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1819580286881719926&wfr=spider&for=pc">银行一类卡和二类卡，你真的了解吗？</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1820734629613952230&wfr=spider&for=pc">中国银行一类卡和二类卡的区别？</a></p>
<p>有关银行卡的知识，同下。 </p>
<h2 id="社保"><a href="#社保" class="headerlink" title="社保"></a>社保</h2><blockquote>
<p>2025 年 12 月 2 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://m.weifenghr.com/taiyuan-sbjsq/">太原2025社保计算器_五险一金计算器_微蜂网</a></p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs routeros">社保11月份没买，公司交的部分，按太原标准发给你，你自己买。<br>下个月开始，在公司买社保，个人要扣除569.72元，也就是下个月工资是<span class="hljs-attribute">4000</span>=569.72<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">公司买的话，买广州的社保，医保什么的可以全国通用的，你问问慧敏，公司给他买的也是广州社保<br></code></pre></td></tr></table></figure>

<p>按养老保险缴纳8%、医疗保险缴纳2%，工伤保险缴纳0.2%的标准，以自己的全额工资为主，在广州交社保个人缴纳576.54元，公司缴纳部分1408.90元，一共1985.44元。</p>
<p>这个计算结果相当接近了。</p>
<p>如果按太原的标准，那个人缴纳515元，公司缴纳1307.5元，一共1822.5元。</p>
<p>那看来挺划算。</p>
<p>昨天报了中行卡账号，周四晚前就能领到上个月工资了，高兴高兴，一个月辛辛苦苦收入还是不赖的，上个月差旅费还会额外发给我。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">广州省广州市天河区<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://sghexport.shobserver.com/html/baijiahao/2025/07/20/1613202.html">不知道“五险一金”是什么？看这篇就够了</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">“转正后缴纳”：违法！《社会保险法》第五十八条规定，用人单位应当自用工之日起三十日内为其职工向社会保险经办机构申请办理社会保险登记。未办理社会保险登记的，由社会保险经办机构核定其应当缴纳的社会保险费。即使在试用期，用人单位与劳动者协商一致，也不能不缴纳社保费哦！<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4843347037426487499&sourceFrom=search_a">秒懂“五险一金”原来是这么回事～😲</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1813294399378452721&wfr=spider&for=pc">一口气读懂五险一金</a></p>
<p>‌<strong>激活社保卡金融功能需本人持有效身份证件和社保卡原件，到卡面所示服务银行的全国任一网点柜台办理，16周岁以下未成年人可由监护人代办。</strong>‌ 该流程依据银行监管规定，无法线上办理，且激活时可同步启用社保功能。‌</p>
<ul>
<li>‌<strong>必备材料</strong>‌：本人有效身份证件（如居民身份证）及社保卡原件；16周岁以下未成年人需额外提供监护人身份证件及关系证明（如户口簿、出生医学证明）。‌</li>
<li>‌<strong>办理步骤</strong>‌：确认社保卡卡面所示服务银行；本人携带材料至该银行全国任一网点（部分银行支持异地激活）；在柜台设置金融账户密码，完成激活。‌</li>
<li><strong>特殊人群</strong>‌：<strong>未成年人</strong>由监护人持双方证件及关系证明代办；<strong>行动不便者</strong>可联系银行预约上门服务。‌</li>
<li><strong>关键说明</strong>‌：必须本人办理（未成年人除外），不可代办或线上操作；激活后金融功能立即生效，用于养老金发放等资金存取；未激活仅社保功能可用；社保功能可通过“电子社保卡”小程序等线上启用，但金融功能需线下办理。‌</li>
</ul>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs">激活后金融功能立即生效，用于养老金发放等资金存取；未激活仅社保功能可用。<br>这句话什么意思，我入职后正常缴纳五险一金，未激活金融功能的社保卡可以正常使用吗？<br></code></pre></td></tr></table></figure>

<p><strong>答案是：完全可以正常使用。</strong></p>
<p>您入职后，公司为您正常缴纳“五险一金”（其中“五险”就是通过社保卡来关联的），完全不受社保卡金融功能是否激活的影响。</p>
<p>五险一金的缴纳主要通过单位账户完成，与社保卡是否激活无直接关联。即使未激活社保卡，单位仍可正常为员工缴纳社保费用。‌</p>
<ul>
<li><strong>医保使用</strong>：您可以直接用未激活金融功能的社保卡去医院看病、在定点药店买药，医保报销部分会正常结算。</li>
<li><strong>社保缴费记录</strong>：您的养老保险、失业保险等缴费记录会正常计入您的个人社保账户，可以通过社保局官网、APP或线下机器查询。</li>
</ul>
<p><strong>简单来说：金融功能只关系到“钱怎么发到您手上”，而社保功能关系到“您的社保权益和记录”。</strong>只要公司为您正常参保，您的社保权益就在持续积累。</p>
<p>虽然不激活金融功能不影响您现阶段使用社保待遇，但还是<strong>强烈建议您尽快抽空去银行网点激活它</strong>，原因如下：</p>
<ol>
<li><strong>未来领取待遇需要</strong>：当您未来需要领取养老金、报销生育津贴等现金补贴时，钱会打到这个金融账户。如果账户未激活，钱可能无法正常打入，会影响您领取。</li>
<li><strong>一卡多用，方便省事</strong>：激活后，您就不需要额外提供其他银行卡号给单位或社保机构用于接收各类补贴，一张卡全搞定。</li>
<li><strong>激活是免费的</strong>：携带本人身份证和社保卡，到卡面上所示银行的任意网点（如卡上印着“工商银行”，就去工行网点）即可办理激活手续，设置银行卡密码，整个过程很快。</li>
</ol>
<p>现在未激活金融功能，<strong>完全不影响</strong>入职后正常使用社保（看病、买药、积累缴费年限），考虑到未来需要顺利领取各种社保待遇，建议<strong>尽早激活</strong>金融功能。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">你说的很清楚明白，我能不能这么理解，不激活完全不影响交社保，激活金融功能后就能将其当作一张储蓄卡来使用了。<br></code></pre></td></tr></table></figure>

<p>社保卡金融功能未激活并不影响交社保用社保，公司为您缴纳社保费用、您用卡看病报销、积累社保权益，这些核心功能完全不受影响。</p>
<p>而金融功能激活后，社保卡就变成了一张标准的银行借记卡，具备所有储蓄卡的功能（存钱、取钱、转账、理财等）。</p>
<p>完全正确。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">借记卡，储蓄卡，信用卡，一类卡，二类卡……等等这些概念是什么意思啊<br></code></pre></td></tr></table></figure>

<p>银行卡按功能和本质分类，可分为借记卡 vs 信用卡。</p>
<p><strong>储蓄卡</strong>、工资卡，这两个名字都是借记卡的俗称。</p>
<p><strong>信用卡</strong>，又叫透支卡，银行先给您一个信用额度（比如1万元），您可以在额度内直接花钱，这相当于向银行借了一笔短期贷款。到每个月账单日，您需要把花的钱还给银行，逾期不还会产生高额利息和影响信用。</p>
<p><strong>借记卡/储蓄卡是花自己的钱；信用卡是花银行的钱（要还的）。</strong></p>
<p> 银行卡按账户权限分类，又可分为一类卡、二类卡和三类卡</p>
<p>这是中国人民银行（中国的央行）为了管理账户风险而做的规定，主要针对的是<strong>借记卡</strong>（以及其背后的银行账户）。</p>
<p>您可以把它想象成家里的门：一类卡是大门，二类卡是房门，三类卡是保险柜的小门。</p>
<table>
<thead>
<tr>
<th align="left">卡类型</th>
<th align="left">形象比喻</th>
<th align="left">功能与限额（年累计限额）</th>
<th align="left">特点与用途</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>一类卡</strong></td>
<td align="left"><strong>家里的“大门”</strong></td>
<td align="left"><strong>全能、无限额</strong>（理论上受银行单日限额限制，但年累计无上限）。</td>
<td align="left">· <strong>全功能账户</strong>。 · 存款、取款、转账、理财、消费，所有功能不受限制。 · <strong>一个人在同一家银行只能开立一个一类户</strong>。您的工资卡、主要理财卡通常就是这个。</td>
<td></td>
</tr>
<tr>
<td align="left"><strong>二类卡</strong></td>
<td align="left"><strong>家里的“房门”</strong></td>
<td align="left"><strong>有限额</strong>： · 存入/转入资金：日限额1万，<strong>年累计限额20万</strong>。 · 消费/支出：日限额1万，<strong>年累计限额20万</strong>。</td>
<td align="left">· <strong>限制功能账户</strong>。 · 适合用于日常小额消费、绑定支付软件（微信/支付宝）、买理财等，资金安全更有保障。 · 一个人在同一家银行可以开多个二类户。</td>
<td></td>
</tr>
<tr>
<td align="left"><strong>三类卡</strong></td>
<td align="left"><strong>家里的“保险柜”</strong></td>
<td align="left"><strong>限额很低</strong>：账户余额最高不超过<strong>2000元</strong>，用于小额快捷支付。</td>
<td align="left">· <strong>极度限制账户</strong>。 · 主要用于手机扫码支付、闪付等小额消费场景。 · 即使被盗，损失也有限。</td>
<td></td>
</tr>
</tbody></table>
<p><strong>重要关系：</strong></p>
<ul>
<li>您新办的<strong>社保卡上的金融账户，默认就是一类卡</strong>（只要您在该银行没有其他一类卡）。</li>
<li>如果您在某家银行已经有一张一类卡（比如以前的工资卡），再办新卡（包括社保卡）时，银行可能会询问您是否要将新卡降为二类卡，或者将旧卡降级。</li>
</ul>
<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4555145334728301772&sourceFrom=search_a">💳社保卡六大实用功能，你知道几个</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1839039263402904256&wfr=spider&for=pc">五险一金到底有啥用？作为子女和打工人，我终于想明白了</a></p>
<hr>
<p>接下来的问答涉及到大量的 AI 回复内容，其回复不可谓不精准正确，索性把三次提问得到的结果都贴在下面了，<strong>交五险一金到底有什么好处</strong>。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs">都说交社保交五险一金对自己有好处，究竟有什么好处呢，网络上的资源内容来来去去就是那几个字眼：什么养老保险累计交够15年就能在退休后领养老金，医保将来能报销能买药，失业保险交够满一年后可以在被动离职后每月领钱，工伤保险生育保险又能保障自己的安全更人性化……<br>但是这养老金每月能领多少呢，医保缴够后将来能怎么报销呢，又怎么买药，失业保险又能领多少钱，工伤后怎么申请工伤险呢……等等这些细枝末节的问题我完全不晓得答案。<br></code></pre></td></tr></table></figure>

<p>您这个问题问得非常好，也特别实在！您的感觉完全正确——网络上大部分信息都停留在“有什么”的层面，而您关心的是“怎么用”、“能得多少”这个核心问题。这就像别人只告诉您“汽车能代步”，而您想知道的是“这车怎么开？油耗多少？能跑多快？”。</p>
<p>下面，我将抛开那些笼统的字眼，用最直白的方式为您拆解“五险一金”实实在在的好处和操作细节。</p>
<hr>
<p>养老保险：退休金到底怎么算？</p>
<p><strong>核心好处</strong>：只要累计缴满15年，并达到法定退休年龄，退休后就可以<strong>每月领钱，活到老领到老</strong>。这个钱还会随着社会平均工资的增长而增加，是退休后最稳定的收入来源。</p>
<p><strong>关键问题：每月能领多少？</strong></p>
<p>计算公式非常复杂，但我们可以用一个“白话版”来理解，它主要取决于三大要素：</p>
<ol>
<li><strong>“存款”多少（您的缴费基数）</strong>：您工资越高，缴费基数就越高，个人账户里存的钱就越多。原则是“多缴多得”。</li>
<li><strong>“存款”多久（您的缴费年限）</strong>：您交的时间越长，账户里的钱也越多。原则是“长缴多得”。<strong>交满15年只是门槛，建议一直交到退休</strong>。</li>
<li><strong>“社会平均工资”（退休时上年度全省市的社会平均工资）</strong>：您退休时社会的整体工资水平越高，您能领到的基础养老金也越高。</li>
</ol>
<p><strong>一个极简的估算例子</strong>：</p>
<p>假设您退休时，当地社会平均工资为8000元/月，您一生的平均缴费工资也是8000元，缴费刚好30年。</p>
<ul>
<li><strong>基础养老金</strong>≈ (8000 + 8000) / 2 × 30 × 1% = <strong>2400元/月</strong></li>
<li><strong>个人账户养老金</strong>≈ 您个人账户里全部储存额（您自己缴的部分+利息） ÷ 一个固定的计发月数（如60岁退休是139个月）。假设您个人账户有20万，那么这部分 ≈ 200000 / 139 ≈ <strong>1439元/月</strong>。</li>
</ul>
<p>那么您每月总养老金 ≈ 2400 + 1439 = <strong>3839元/月</strong>。</p>
<p><strong>请注意，这只是一个简化模型</strong>，但能帮您理解其构成。实际金额可以通过支付宝/微信中的“社保查询”服务或当地人社APP进行测算。</p>
<hr>
<p>医疗保险：具体怎么报销和买药？</p>
<p><strong>核心好处</strong>：解决“看病贵”的问题。它分为两个账户：</p>
<ol>
<li><strong>个人账户（医保卡里的钱）</strong>： <strong>来源</strong>：您自己缴纳的医保部分（约2%）会进入这个账户。 <strong>怎么用</strong>：就像一笔医疗专款，可以用来： <strong>在定点药店刷卡买药</strong>（非处方药和部分处方药）。 <strong>支付门诊、急诊、住院的起付线以下和个人自付部分的费用</strong>。</li>
<li><strong>统筹账户（国家的大池子）</strong>： <strong>来源</strong>：公司为您缴纳的大部分医保进入这个公共基金。 <strong>怎么用（报销）</strong>：当您的医疗费用超过一定金额（称为“起付线”或“门槛费”）后，就可以按比例报销。 <strong>报销流程</strong>：在<strong>定点医院</strong>看病时，在挂号、缴费时主动出示社保卡（或电子医保凭证），系统会直接进行结算——您只需要支付<strong>报销后需要自己掏腰包的那部分</strong>，报销部分由医院和医保系统直接结算，您无需垫付再跑报销。 <strong>报销比例</strong>：通常医院级别越高（如三甲医院），报销比例越低（如70%-85%）；社区医院报销比例更高（可能超过90%）。也有年度报销上限（封顶线），一般为几十万元。</li>
</ol>
<hr>
<p>失业保险：被动离职后能领多少钱？</p>
<p><strong>核心好处</strong>：被公司辞退、合同到期公司不续签等非自愿失业后，提供过渡性的经济支持。</p>
<p><strong>关键问题：能领多少？领多久？</strong></p>
<ul>
<li><strong>能领多少</strong>：各地标准不同，但通常是**当地最低工资的70%-90%**。例如，某市最低工资2320元/月，失业金可能在1600-2100元/月左右。具体金额由当地社保局核定。</li>
<li><strong>领多久</strong>：与您缴费时间挂钩。 缴费满1年不足5年：最长领12个月。 缴费满5年不足10年：最长领18个月。 缴费10年以上：最长领24个月。</li>
<li><strong>怎么领</strong>： 单位需在解除劳动关系后为您办理“社保停保”，并注明原因是非本人意愿（如辞退）。 您本人在离职后，携带身份证、社保卡等材料到<strong>户籍地或参保地的公共就业服务机构</strong>办理失业登记。 审核通过后，失业金会按月发放到您的社保卡金融账户或指定银行卡。</li>
</ul>
<hr>
<p>工伤保险与生育保险：怎么申请？</p>
<p><strong>（1）工伤保险</strong></p>
<ul>
<li><strong>场景</strong>：在工作时间、工作地点、因工作原因受伤/患病/死亡（包括上下班途中非本人主责的交通事故）。</li>
<li><strong>怎么申请</strong>： <strong>第一时间</strong>：救治伤员，并通知单位和人力资源部门。 <strong>单位申报</strong>：单位应在规定时间内（通常是30日内）向人社局提交《工伤认定申请表》及相关证据（如病历、证人证言、事故证明）。 <strong>认定</strong>：人社局调查后出具《工伤认定决定书》。 <strong>待遇</strong>：认定后，医疗费用由工伤保险基金报销，停工留薪期间工资照发，并根据伤残等级获得一次性伤残补助金等。</li>
</ul>
<p><strong>（2）生育保险</strong></p>
<ul>
<li><strong>核心好处</strong>：报销生育相关的医疗费（产检、分娩等），并领取产假期间的“工资”（叫生育津贴）。</li>
<li><strong>怎么享受</strong>： <strong>报销</strong>：在定点医院生育，通常也是直接刷社保卡结算。 <strong>领津贴</strong>：女职工休产假期间，由生育保险基金支付生育津贴。一般是由单位代为申领，然后发放给个人。金额与单位上年度平均工资和产假天数挂钩。</li>
</ul>
<p><strong>最后，关于“一金”——住房公积金</strong>，它的好处极其实在：</p>
<ul>
<li><strong>贷款</strong>：用公积金贷款买房，利率远低于商业贷款（能省下几十万利息）。</li>
<li><strong>提取</strong>：不仅可以用来买房、建房、租房，现在很多城市也支持用于支付大病医疗、老旧小区加装电梯等。</li>
</ul>
<p><strong>总结一下</strong>：</p>
<p>“五险一金”不是虚无缥缈的概念，它是一套设计精密的国家保障体系。了解这些细节，才能在未来需要时真正地“用对”、“用好”它，让它成为您生活最坚实的后盾。建议您下载当地人社APP和公积金APP，实名认证后，可以随时查询自己的缴费明细和账户余额，做到心中有数。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs">领多久：与您缴费时间挂钩。<br>缴费满1年不足5年：最长领12个月。<br>缴费满5年不足10年：最长领18个月。<br>缴费10年以上：最长领24个月。<br><br>这个还是没有说明白，能领多少钱你说明白了，但具体能领多久你没说明白，假设我缴费至少一年了，我每次失业后都能领失业金吗，能领多久？再工作半年后又失业了还能继续领吗？到底能领多长时间。<br></code></pre></td></tr></table></figure>

<p>您这个问题问到了关键点上！我之前的解释确实不够精确，非常抱歉。这个“最长领多久”的规则很容易让人混淆，因为它涉及到 <strong>“累计缴费年限”</strong>和 <strong>“单次领取期限”</strong>以及 <strong>“剩余待遇”</strong>这几个概念。</p>
<p>下面我用最清晰的方式为您彻底讲明白。</p>
<p>核心原则：不是“<strong>每次失业都能完整地领一遍</strong>”。</p>
<p>失业金的领取规则，可以理解为您有一个 <strong>“失业保险待遇账户”</strong>，这个账户的总额度是由您<strong>职业生涯总的累计缴费年限</strong>决定的。但每次失业，您只领取其中的一部分，没用完的额度可以存起来下次再用。</p>
<hr>
<p>第一部分：首次失业，能领多久？（单次领取期限）</p>
<p>这个“最长领取月数”的表格，指的是您<strong>第一次</strong>符合条件申请失业金时，根据您<strong>截至当时为止的总缴费年限</strong>，所能领取的<strong>最长月数</strong>。</p>
<p><strong>举例说明：</strong></p>
<ul>
<li><strong>小王</strong>，工作了3年零1个月（累计缴费满3年，不足5年），不幸被公司裁员。 他首次失业，<strong>最多可以领取12个月</strong>的失业金。</li>
<li><strong>老李</strong>，在同一家公司勤勤恳恳工作了11年（累计缴费满10年以上），不幸被裁员。 他首次失业，<strong>最多可以领取24个月</strong>的失业金。</li>
</ul>
<p><strong>这就是您看到的那个表格的意思。它确定的是您“首次申领”时的天花板。</strong></p>
<hr>
<p>第二部分：最关键的问题——再就业后又失业，还能领吗？能领多久？</p>
<p><strong>答案是：能领，但规则很特别。</strong>这里分两种情况，我们用两个例子来彻底讲清：</p>
<p>情况一：领完失业金后再就业，又失业</p>
<p><strong>规则</strong>：重新就业后，<strong>再次缴费满一年</strong>以上后再次失业的，缴费时间<strong>重新计算</strong>，可以再次申领失业金。</p>
<ul>
<li><strong>举例</strong>： 小王第一次失业，领了<strong>8个月</strong>失业金后找到新工作。 他在新单位又干了<strong>2年</strong>后，再次被裁员。 <strong>他能领多久？</strong>因为他重新就业后缴费已满一年（实际是2年），所以可以<strong>再次申领</strong>。根据他<strong>新的累计缴费年限（2年，属于“满1年不足5年”）</strong>，他第二次失业<strong>最多可以再领12个月</strong>。</li>
</ul>
<p><strong>注意</strong>：他第一次没领完的4个月（12-8=4）不会累积到第二次，因为第二次申领是基于新的缴费记录重新计算资格和期限的。</p>
<p>情况二：没领完失业金就再就业，又失业（您问的情况）</p>
<p><strong>规则</strong>：这是最复杂也最重要的一条。前次失业应领取而尚未领取的失业保险金的期限<strong>可以保留</strong>，与下次失业后应领取的期限<strong>合并计算</strong>，但合并后的期限最长不能超过24个月。</p>
<ul>
<li><strong>举例</strong>： 小王第一次失业，根据他7年的总缴费年限（满5年不足10年），他<strong>最多可以领18个月</strong>。 但他只领了<strong>3个月</strong>，就找到新工作了。于是他主动停止领取失业金。 他在新单位只干了<strong>半年</strong>（注意，这次缴费未满一年），又不幸被裁员。 <strong>他还能领吗？能领多久？</strong> <strong>能领</strong>！因为他上次失业还有<strong>未领完的期限</strong>：18个月 - 3个月 = <strong>15个月</strong>的额度。 这次他虽然只工作了半年（缴费未满一年），不具备“重新计算”的资格，但他可以<strong>继续申领上次剩余的15个月额度</strong>。 他这次失业，可以继续把上次剩下的15个月领完。</li>
</ul>
<hr>
<p>为了让您一目了然，我们可以把失业金想象成一个有时间限制的“专属红包”：</p>
<table>
<thead>
<tr>
<th>您的工作变动情况</th>
<th>对失业金的影响</th>
<th>关键点</th>
</tr>
</thead>
<tbody><tr>
<td><strong>第一次失业</strong></td>
<td>根据<strong>总缴费年限</strong>，开启一个专属红包，有效期最长为表格规定的月数（如12、18、24个月）。</td>
<td>确定初始额度。</td>
</tr>
<tr>
<td><strong>领完红包后再就业，又失业</strong></td>
<td>必须<strong>重新工作并缴费满一年</strong>，才能开启一个<strong>新的红包</strong>。新红包大小由<strong>新的累计缴费年限</strong>决定。</td>
<td><strong>重新计算，旧额度作废</strong>。</td>
</tr>
<tr>
<td><strong>没领完红包就再就业，又失业</strong></td>
<td>旧红包里剩下的钱<strong>不会消失</strong>！你可以继续领完。如果新工作缴费又满一年，旧红包的剩余额度会和新红包的额度合并，但总额不能超过24个月。</td>
<td><strong>余额保留，合并计算</strong>。</td>
</tr>
</tbody></table>
<p><strong>最后的重要提醒</strong>：</p>
<ol>
<li><strong>非自愿离职</strong>：必须是公司辞退、合同到期公司不续签等非本人意愿中断就业的情况才能申领。自己主动辞职是不可以的。</li>
<li><strong>及时办理</strong>：离职后应在规定时间内（通常是60天）办理失业登记，才有资格领取。</li>
</ol>
<p>希望这个详细的解释和例子能彻底解决您的疑惑！这套规则设计得比较精细，就是为了在保障失业者生活的同时，鼓励大家积极再就业。</p>
<hr>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">我明白了，那能领多少钱跟自己缴费多少没有关系吗，我只看到你说按当地最低工资标准来发放。<br></code></pre></td></tr></table></figure>

<p>您这个问题非常尖锐，直接触及了失业保险制度的一个核心特点：<strong>它更侧重于“保基本生活”而非“按劳分配”。</strong></p>
<p>您的观察非常准——<strong>失业金的金额，确实与您失业前工资的高低、个人缴费的多少没有直接的正比关系。</strong></p>
<p>但这不代表完全无关，我来为您拆解这其中的逻辑：</p>
<ol>
<li>核心决定因素：确实是“最低工资标准”</li>
</ol>
<p>您说得对，失业保险金的主要发放标准是参照<strong>参保地所在城市的最低工资标准</strong>的一个比例（通常是70%-90%）。这是为了确保一个公平的“托底”机制，保障所有失业者都能获得维持基本生活的费用，而不是拉大收入差距。</p>
<ul>
<li><strong>例如</strong>：北京2023年月最低工资标准是2320元，那么失业金可能在1624元（2320×70%）到2088元（2320×90%）这个区间内。一个失业前月薪5000元和一个失业前月薪15000元的人，只要参保地相同，他们领取的失业金金额会非常接近。</li>
</ul>
<ol start="2">
<li>间接关联因素：您的缴费工资有“天花板”和“地板”</li>
</ol>
<p>虽然金额不直接挂钩，但您的缴费基数（也就是您的工资）通过以下方式间接影响着您能领到的钱：</p>
<ul>
<li><strong>“天花板”效应（封顶）</strong>：失业金不会无限高。它有上限，这个上限就是当地最低工资的某个比例（如90%）。即使您月薪10万，缴费基数按最高上限缴纳，您领到的失业金也不会超过这个法定上限。</li>
<li><strong>“地板”效应（托底）</strong>：法律规定，您的缴费基数不能低于当地社保缴费的<strong>最低基数</strong>（通常是当地平均工资的60%或当地最低工资标准）。所以，即使您工资再低，也是按这个最低基数来缴费的，从而保证了您失业后领取的金额不会低于一个底线。</li>
</ul>
<p><strong>简单比喻：</strong></p>
<p>失业保险更像一个“公共游泳池”，它有统一的浅水区和深水区（水位由最低工资决定），而不是一个根据您缴费量为您定制的“私人浴缸”。无论您之前贡献的水量是1吨还是10吨，您进来后都在同一个池子里游泳，水位对大家都一样。</p>
<ol start="3">
<li>与缴费直接挂钩的是什么？——是“领取资格”和“期限”</li>
</ol>
<p>这才是您的缴费贡献真正发挥作用的地方！您的缴费工资高、缴费年限长，主要换来的是：</p>
<ol>
<li><strong>更稳固的领取资格</strong>：缴费满一年是门槛。</li>
<li><strong>更长的领取期限</strong>：如我们之前讨论的，缴费5年能领18个月，缴费10年以上能领24个月。这是对长期、稳定缴费人员的重要回报。</li>
</ol>
<p>为什么这样设计？</p>
<p>这种“金额保基本，期限论贡献”的设计，是基于社会保险的“共济”和“再分配”原则：</p>
<ul>
<li><strong>社会共济</strong>：高收入者多缴费，与低收入者一起充实失业保险基金，共同增强社会抵御失业风险的能力。</li>
<li><strong>保障基本</strong>：核心目标是防止失业者及其家庭因收入中断而陷入贫困，而不是维持其原有的生活水平。维持原有生活水平更多需要通过个人储蓄、投资等渠道来实现。</li>
<li><strong>促进再就业</strong>：如果失业金与原有工资挂钩过高，可能会降低部分人寻找新工作的积极性。设定一个“保基本”的水平，有助于激励失业人员尽快重返劳动力市场。</li>
</ul>
<p><strong>总结一下：</strong></p>
<p>您可以这样理解失业保险的逻辑：</p>
<ul>
<li><strong>“您能领多久”</strong>-&gt; 这是对您<strong>长期缴费贡献</strong>的奖励。</li>
<li><strong>“您能领多少”</strong>-&gt; 这是社会对您<strong>基本生活需求的保障</strong>。</li>
</ul>
<p>所以，虽然您感觉自己的高缴费没有直接换来更高的失业金，但它为您换来了更长的保障期限和更稳固的保障资格，这本身就是一种重要的对等回报。希望这个解释能帮您更好地理解失业保险的设计初衷！</p>
<h2 id="月薪"><a href="#月薪" class="headerlink" title="月薪"></a>月薪</h2><blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p>这个计算是完全正确的，它准确地反映了在特定情况下（只工作了一段时间且处于试用期）的月工资计算方法。</p>
<p>我来为您详细解释一下这个公式背后的逻辑和每个数字的含义。</p>
<p>公式分解：8 / 21.75 * 4000 = 1471.26</p>
<p>这个公式是标准的 <strong>“日薪制”</strong>计算方法，适用于计算未出满勤月份的工资。</p>
<ol>
<li><strong>21.75（月计薪天数）</strong>：这是整个计算的核心基础。它不是一个估算值，而是中国人力资源和社会保障部规定的官方计薪天数。<strong>来源</strong>：一年有365天，共52周零1天。扣除104天周末（52周 * 2天）后，剩下的261天为法定工作日。再将这261天平均到12个月，就得出：<strong>261天 ÷ 12个月 = 21.75天/月</strong>。<strong>关键点</strong>：这个数字是固定的，<strong>不考虑当月实际有多少个工作日</strong>（比如2月可能只有20个工作日，而10月可能有23个）。所有月的计薪天数都统一按21.75天计算，这样可以避免大小月、节假日造成的计算不公平。</li>
<li><strong>4000（您的试用期月薪）</strong>：这是您与公司约定的、在正常工作满一个月（即计薪天数21.75天）的情况下，应得的全额工资。</li>
<li><strong>8（您上个月的实际出勤天数）</strong>：这是您在上个月实际为公司工作的天数。</li>
</ol>
<p>计算逻辑（正算法）：</p>
<ul>
<li><p><strong>第一步：计算日薪</strong></p>
<figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs abnf">日薪<span class="hljs-operator">=</span><span class="hljs-number">21.75</span>月薪<span class="hljs-operator">=</span><span class="hljs-number">21.754000</span>≈<span class="hljs-number">183.91</span><br></code></pre></td></tr></table></figure></li>
<li><p><strong>第二步：计算当月应得工资</strong></p>
<figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs abnf">应得工资<span class="hljs-operator">=</span>日薪×实际出勤天数<span class="hljs-operator">=</span><span class="hljs-number">183.91</span>×<span class="hljs-number">8</span>≈<span class="hljs-number">1471.28</span><br></code></pre></td></tr></table></figure></li>
</ul>
<p>整个计算的思路是：先算出您每天的工资是多少，然后再乘以您实际工作的天数。</p>
<h2 id="服务器"><a href="#服务器" class="headerlink" title="服务器"></a>服务器</h2><blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1842388928096674304&wfr=spider&for=pc">小型公司一般用什么服务器？这五点须知晓</a></p>
<figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs subunit">.入门级塔式服务器<br>代表型号：戴尔PowerEdge T系列（如T150/T350）、惠普ProLiant ML系列（如ML30 Gen10+）、联想ThinkSystem ST系列（如ST250）。<br>使用场景：适合员工规模20人以下的企业，用于文件共享、基础ERP系统或小型数据库。<br>配置建议：通常配备Intel Xeon E<span class="hljs-string">-2300</span>系列或AMD EPYC 3000系列处理器，16<span class="hljs-string">-32</span>GB内存，1<span class="hljs-string">-2</span>块企业级SATA硬盘（可选RAID 1冗余）。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_45261442/article/details/145047829">公司服务架构_互联网公司服务器内存多大-CSDN博客</a></p>
<p>服务器的配置与公司架构的大小、使用场景、负载需求密切相关。以下是各类服务器配置总结：</p>
<p>小型公司：适合 4 核 CPU，8GB 内存，500GB SSD 的服务器，用于开发、测试及低流量生产环境。</p>
<p>中型公司：适合 8 核 CPU，16GB - 64GB 内存，1TB SSD 配 RAID 配置，用于高流量应用的生产环境。</p>
<p>大型公司：适合 16 核以上 CPU，64GB - 128GB 内存，企业级存储系统和高可用架构，用于高并发、大数据、高可用需求。</p>
<p>云架构：根据需求动态配置，使用弹性计算、存储和负载均衡服务，适合大规模分布式系统。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">磁盘阵列模式（RAID）是一种通过组合多个独立硬盘实现数据冗余与性能优化的存储技术，全称为独立磁盘冗余阵列。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_60861848/article/details/149427527">一篇文章彻底搞懂RAID磁盘阵列及其配置使用-CSDN博客</a></p>
<p>RAID（Redundant Array of Independent Disks）即独立磁盘冗余阵列，是一种通过多磁盘组合实现数据冗余、性能提升或二者兼顾的存储虚拟化技术。其核心原理包括：</p>
<ul>
<li>条带化（Striping）：数据分块并行写入多磁盘（如RAID 0）</li>
<li>镜像（Mirroring）：数据完全复制到多磁盘（如RAID 1）</li>
<li>奇偶校验（Parity）：通过校验数据实现故障恢复（如RAID 5/6）</li>
</ul>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/2401_86331179/article/details/141029652">RAID的介绍和配置_组raid-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1827213495001147485&wfr=spider&for=pc">服务器尺寸详解：从1U到42U的完整指南</a></p>
<h2 id="中国银行"><a href="#中国银行" class="headerlink" title="中国银行"></a>中国银行</h2><blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p>看看这周末有空出门办理下银行卡吧，这些事情其实上周出差那会儿就能告诉我的，工资打不到账户了才通知我要办个中国银行的卡。</p>
<p><a target="_blank" rel="noopener" href="https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4413461364429581286&sourceFrom=search_a">中国银行开卡攻略：跑了三次终于搞定</a></p>
<p><a target="_blank" rel="noopener" href="https://jingyan.baidu.com/article/6fb756ec3b41e8651958fb42.html">中国银行怎么办银行卡-百度经验</a></p>
<p>身份证，在职证明？申请表，线上办理，设置交易密码，绑定信息，激活。</p>
<p><a target="_blank" rel="noopener" href="https://zhidao.baidu.com/question/1188299622193674139.html">中国银行自助办卡流程是什么_百度知道</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1782268309558411824&wfr=spider&for=pc">中国银行线上申请办卡指南</a></p>
<p>能线上办理才最好。</p>
<p><a target="_blank" rel="noopener" href="https://zhidao.baidu.com/question/1780637542073887300.html">中国银行卡怎么办理 需要带什么过去_百度知道</a></p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/search?type=content&q=%E4%B8%AD%E5%9B%BD%E9%93%B6%E8%A1%8C%E5%8D%A1%E5%8A%9E%E7%90%86">(99+ 封私信 / 82 条消息) 中国银行卡办理 - 搜索结果 - 知乎</a></p>
<p>知乎上办理流程风评很差劲。</p>
<p><a target="_blank" rel="noopener" href="https://www.cadforex.com/yinhk/115185.html">办银行卡是对私还是对公 - 财梯网</a></p>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">我要在中国银行<span class="hljs-keyword">APP</span>上预约办理银行卡，单位发工资需要用中国银行卡，这里取号时选择现金业务还是其他业务啊，不懂。<br></code></pre></td></tr></table></figure>

<p><strong>应该选择“其他业务”。</strong></p>
<p><strong>原因如下：</strong></p>
<ol>
<li><strong>业务性质匹配：</strong>办理银行卡（特别是工资卡）属于“账户开立”或“个人业务”，而不是直接的现金存取、兑换等“现金业务”。银行通常将“开卡”归类在“个人非现金业务”或简单的“其他业务”中。</li>
<li><strong>界面提示：</strong>在APP的选项里，“现金业务”通常有明确的指向性。选择“其他业务”是一个更通用和准确的选择，可以涵盖开卡、挂失、签约网银等多种服务。</li>
</ol>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">单位发工资要给中国银行卡里打钱，办理这种业务是对公还是对私的，去的时候需要携带什么证件？<br></code></pre></td></tr></table></figure>

<p>为了确保一次办成，请按以下清单准备：</p>
<table>
<thead>
<tr>
<th align="left">物品类别</th>
<th align="left">具体物品</th>
<th align="left">重要性</th>
<th align="left">备注</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>必须携带</strong></td>
<td align="left"><strong>本人身份证原件</strong></td>
<td align="left">★★★★★</td>
<td align="left">无身份证无法办理</td>
</tr>
<tr>
<td align="left"><strong>必须携带</strong></td>
<td align="left"><strong>本人实名认证的手机</strong></td>
<td align="left">★★★★★</td>
<td align="left">用于接收验证码和绑定银行卡</td>
</tr>
<tr>
<td align="left"><strong>建议携带</strong></td>
<td align="left"><strong>工作证明</strong>（盖章文件/工牌/劳动合同）</td>
<td align="left">★★★★☆</td>
<td align="left">证明办卡用途，成功率大增</td>
</tr>
<tr>
<td align="left"><strong>需要知晓</strong></td>
<td align="left"><strong>个人详细现住址</strong>（精确到门牌号）</td>
<td align="left">★★★☆☆</td>
<td align="left">银行系统必填项</td>
</tr>
<tr>
<td align="left"><strong>需要知晓</strong></td>
<td align="left"><strong>单位全称、地址等信息</strong></td>
<td align="left">★★☆☆☆</td>
<td align="left">开户时可能会询问并录入系统</td>
</tr>
</tbody></table>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">我只能说办理一张工资卡吗，就不能找个合适的理由正常办理储蓄卡吗。<br></code></pre></td></tr></table></figure>

<p><strong>“你好，我想新开一张借记卡，作为工资卡使用。单位要求用中国银行的卡。”</strong></p>
<p>直接说办“工资卡”其实是<strong>最合适、最顺利</strong>的理由。</p>
<p>为什么这么说？我们来对比一下：</p>
<table>
<thead>
<tr>
<th align="left">说法</th>
<th align="left">银行人员的理解</th>
<th align="left">可能的结果</th>
<th align="left">推荐指数</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>“我要办一张工资卡，单位发薪用。”</strong></td>
<td align="left"><strong>“真实、合理的开卡需求。”</strong>工资卡是刚需，受反诈法规保护，银行认为风险较低。</td>
<td align="left"><strong>流程清晰，目标明确。</strong>大堂经理会直接引导你走“工资卡”开户流程，即使需要你提供工作证明（如工牌），也是标准程序，并非刁难。</td>
<td align="left">★★★★★</td>
</tr>
<tr>
<td align="left"><strong>“我就办张普通的储蓄卡，存点钱。”</strong></td>
<td align="left"><strong>“用途模糊，可能存在风险。”</strong>在当前“断卡行动”背景下，这种无具体用途的开卡会触发银行更严格的风控审核。</td>
<td align="left"><strong>可能会被详细追问。</strong>柜员或智能机具可能会问得更细：“主要用途是什么？”“预计资金流量多大？”“有没有理财需求？”等。回答得含糊其辞反而更可疑。</td>
<td align="left"></td>
</tr>
</tbody></table>
<p>等周六上午去最近那家中国银行一趟，携带身份证和工作证明看能不能一次性办好，最近差旅费报销还有从下个月打工资都要用。</p>
<h2 id="盘外"><a href="#盘外" class="headerlink" title="盘外"></a>盘外</h2><blockquote>
<p>2025 年 12 月 2 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site">Configuring a publishing source for your GitHub Pages site - GitHub Docs</a></p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/462149457/answer/3100367987">(99+ 封私信 / 82 条消息) 什么是github-page，为啥好多人在这个上面部署网站，在这上面搭建是不需要自己有后台服务器吗？ - 知乎</a></p>
<blockquote>
<p>2025 年 12 月 1 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7572087181608353842">微信小游戏包体限制4M，一个字体就11.24M，怎么玩？引言 哈喽大家好，很多时候，我们的游戏项目为了美观和保证风格的统 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/655233802/answer/3589187141">(99+ 封私信 / 82 条消息) 码云gitee的Pages服务下线了，有那些替代品？ - 知乎</a></p>
<blockquote>
<p>2025 年 11 月 21 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/O2ZfXQKso_jvSKzs0jxyjQ?poc_token=HKm-H2mjvmhox396NgLP2dtmR2KkzQbGqQypRMuC">Vue-Vben-Admin 从入门到实战：后端开发的前端探索之旅</a></p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7572961448537882651">颜色网站为啥都收费？自己做个要花多少钱？如果一个人做个小型的视频网站，一年到底要花多少钱？ 网站本身的成本+人力成本，我 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7550590347785797641">刚刚 Java 25 炸裂发布！让 Java 再次伟大刚刚，Java 25 正式发布！这是继 Java 21 之后，又一 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7541719099627782180">尤雨溪力荐！Vue3 生态最强大的 14 个 UI 组件库！在 Vue3 官网 的「Ecosystem → UI Com - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7517081861975277603">分享10个吊炸天的油猴脚本，2025最新！油猴（Tampermonkey）是一款浏览器插件，允许用户在网页加载时注入自定 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7573172586839834676">我为什么说全栈正在杀死前端？大家好，我又来了🤣。 打开2025年的招聘软件，十个资深前端岗位，有八个在JD（职位描述） - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7475292103146684479">Java web后端转Java游戏后端作为Java后端开发者转向游戏后端开发，虽然核心编程能力相通，但游戏开发在架构设计 - 掘金</a></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">通过以上流程，Java后端开发者可逐步掌握游戏开发特性，重点需要转变的思维模式包括：从请求响应模式到实时状态同步、从CRUD主导到复杂逻辑计算、从分钟级延迟到毫秒级响应的要求。建议从简单的棋牌类游戏入手，逐步过渡到大型实时游戏开发。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7506051295951732748">没设计也能很漂亮，非常适合独立开发：Trae + 飞个马MCP 因为团队规模比较小，没有专门的设计师，就尝试使用Trae - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 14 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7569159131819753510">我发现很多程序员都不会打日志。。。日志用来记录程序运行时的状态和信息，这样当系统出现问题时，我们可以通过日志快速定位问题 - 掘金</a></p>
<p>Logstash 负责收集各个服务的日志，然后发送给 Elasticsearch 存储和索引，最后通过 Kibana 提供一个可视化的界面。</p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7559150650676805641">让老弟做个数据同步，结果踩了 7 个大坑！第一天上班，老板就交给你一个艰巨的任务：定期把公司的订单数据同步到数据分析仓库 - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 10 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7530119090058231834">那些年我们一起追过的Java技术，现在真的别再追了！今天的Spring Cloud、Kotlin、GraalVM，可能就 - 掘金</a></p>
<blockquote>
<p>2025 年 11 月 5 日</p>
</blockquote>
<p>最近想把这些系列给看了。</p>
<p><a target="_blank" rel="noopener" href="https://www.runoob.com/">菜鸟教程 - 学的不仅是技术，更是梦想！</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7154437479955693598">Docker入门到实践（一）docker简介和安装docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://uniapp.dcloud.net.cn/quickstart-hx.html">uni-app官网</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/user/862486453028888/columns">竹子爱熊猫 的个人主页 - 专栏 - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7201703197424320549">Electron开发实践(1)——为什么选择ElectronElectron的诞生 Electron（原名为Atom S - 掘金</a></p>
<p>把 Vue.js 再过一遍，基础要打牢。</p>
<blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7204013918960074813">Electron开发实践(4)——跨进程通信前言 进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应 - 掘金</a></p>
<p>看不太进去。。</p>
<blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7552066397812506678">接私活神器！一个轻量级的 Java 快速开发平台！X-SpringBoot —— 一个轻量级的 Java 快速开发平台， - 掘金</a></p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7534628703218729002">有了免费的Kiro，这次真的可以把Cursor扔了！Claude的金主爸爸亚马逊（AWS）偷偷发布了一款AI编程工具，K - 掘金</a></p>
<p>掘金，Docker。</p>
<p><a target="_blank" rel="noopener" href="https://juejin.cn/post/7569377216912916518">AI时代的工作和成长引言 去年夏天，我一口气读完几篇AI文章，兴奋得连夜想写点什么。 可一年过去，键盘上落的不是代码，是 - 掘金</a></p>
<h2 id="网线"><a href="#网线" class="headerlink" title="网线"></a>网线</h2><blockquote>
<p>2025 年 11 月 17 日</p>
</blockquote>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">PL2303芯片 和 FTDI 芯片有什么区别？<br></code></pre></td></tr></table></figure>

<table>
<thead>
<tr>
<th align="left">特性</th>
<th align="left">FTDI (Future Technology Devices International)</th>
<th align="left">Prolific (巨量)</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>核心定位</strong></td>
<td align="left"><strong>工业级、商用级</strong>。强调稳定性、可靠性和长期支持。</td>
<td align="left"><strong>消费级、成本敏感型</strong>。主打高性价比和基本功能。</td>
</tr>
<tr>
<td align="left"><strong>稳定性与性能</strong></td>
<td align="left"><strong>极高</strong>。公认的稳定性标杆，数据传输错误率低，兼容性极佳。</td>
<td align="left"><strong>一般</strong>。在简单应用下没问题，但在复杂环境或长时通信中可能不如FTDI稳定。</td>
</tr>
<tr>
<td align="left"><strong>驱动程序</strong></td>
<td align="left"><strong>“教科书级别”的稳定</strong>。驱动更新积极，对不同操作系统（包括旧版Win、Linux、甚至嵌入式系统）支持非常好。策略是<strong>持续优化兼容性</strong>。</td>
<td align="left"><strong>驱动是“重灾区”</strong>。为了打击山寨芯片，Prolific通过更新驱动<strong>故意让旧版和山寨芯片无法使用</strong>，导致用户常因驱动问题无法通信。</td>
</tr>
<tr>
<td align="left"><strong>价格</strong></td>
<td align="left"><strong>较贵</strong>。芯片本身和采用FTDI芯片的线缆价格都更高。</td>
<td align="left"><strong>便宜</strong>。极具成本优势，是大量廉价线缆的首选。</td>
</tr>
<tr>
<td align="left"><strong>山寨情况</strong></td>
<td align="left">有，但FTDI的反制措施更“狠”（曾通过驱动将山寨芯片的PID/VID篡改，导致其变砖），一定程度上抑制了山寨泛滥。</td>
<td align="left"><strong>山寨仿冒芯片极多</strong>。您买到的线，里面的PL2303芯片很可能就是山寨版本。</td>
</tr>
<tr>
<td align="left"><strong>常见型号</strong></td>
<td align="left">FT232RL, FT231X, FT234X等</td>
<td align="left">PL2303TA, PL2303HXD, PL2303HXS, <strong>PL2303GT</strong>等</td>
</tr>
</tbody></table>
<blockquote>
<p>2025 年 11 月 5 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://zixun.jia.com/article/1116056.html">高清线和hdmi线的区别是什么_装修全知道_学堂_齐家网</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1802339168694882921&wfr=spider&for=pc">全网最强讲解：3000多字，解释清楚为什么需要HDMI线？怎么选？</a></p>
<p><a target="_blank" rel="noopener" href="https://map.baidu.com/poi/G307%2F%E5%A4%AA%E5%8E%9F%E7%BB%95%E5%9F%8E%E9%AB%98%E9%80%9F(%E8%B7%AF%E5%8F%A3)/@12537556.243054135,4536459.241212075,18.25z?uid=bbd5eae4d0bf6635c3364467&ugc_type=3&ugc_ver=1&device_ratio=2&compat=1&pcevaname=pc4.1&querytype=detailConInfo&da_src=shareurl">G307/太原绕城高速(路口) - 百度地图</a></p>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E7%BD%91%E7%BA%BF/1888463">网线_百度百科</a></p>
<p>8路千兆以太网接口。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_39906521/article/details/110935341">千兆网线8根线定义图_电脑与电脑之间的网线直连-CSDN博客</a></p>
<p><a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1833565214583179370&wfr=spider&for=pc">网络线序与标准详解：千兆网与百兆网差异深入解析</a></p>
<p>一条能通车的千兆网络，需要以下组成部分协同工作：</p>
<table>
<thead>
<tr>
<th align="left">组成部分</th>
<th align="left">实物比喻</th>
<th align="left">作用和要求</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. 网卡（NIC）</strong></td>
<td align="left"><strong>汽车的引擎</strong></td>
<td align="left">安装在电脑、路由器等设备里。它是核心，决定了设备<strong>有没有能力</strong>跑千兆。一个百兆的网卡，即使用千兆网线和千兆路由器，速度也上不去。</td>
</tr>
<tr>
<td align="left"><strong>2. 网线</strong></td>
<td align="left"><strong>公路路面</strong></td>
<td align="left">负责传输电信号。千兆网络至少需要使用 <strong>Cat 5e（超五类）</strong>或更高级的 <strong>Cat 6（六类）</strong>网线。路面的质量（线材好坏）直接影响稳定性和速度上限。</td>
</tr>
<tr>
<td align="left"><strong>3. 路由器/交换机</strong></td>
<td align="left"><strong>交通枢纽/立交桥</strong></td>
<td align="left">负责指挥数据包去往正确的设备。你必须有一个<strong>千兆端口</strong>的路由器/交换机。如果路由器是百兆的，那么整个内部网络的速度就会被限制在百兆。</td>
</tr>
<tr>
<td align="left"><strong>4. 接口（RJ-45）</strong></td>
<td align="left"><strong>公路的进出口匝道</strong></td>
<td align="left">就是你平时插网线的那个插槽和水晶头。它有8个金属触点。百兆网络实际上只用了其中4个（1,2,3,6），而<strong>千兆网络必须8个触点全部正常工作</strong>。</td>
</tr>
</tbody></table>
<p><strong>简单自检：</strong>要想实现千兆速度，必须确保 <strong>网卡 + 网线 + 路由器</strong>三者都支持千兆标准，缺一不可。</p>
<p>它不是一种特殊的线，而是一个“质量标准”</p>
<p>首先纠正一个常见误解：<strong>并没有一种官方叫做“千兆网线”的线缆</strong>。这个称呼指的是<strong>达到了能够稳定传输千兆网络信号标准的网线</strong>。</p>
<p>这就像说“能跑F1赛车的赛道”，它指的是一种赛道的<strong>修建标准</strong>（平整度、摩擦力、弯道设计等），而不是赛道本身的名字。</p>
<hr>
<p>千兆网线 vs. 百兆网线（公路的“车道”数量）</p>
<p>最根本的区别在于<strong>8根芯线是否全部工作</strong>。</p>
<table>
<thead>
<tr>
<th align="left">网络类型</th>
<th align="left">比喻</th>
<th align="left">线缆要求</th>
<th align="left">常用线缆类别</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>百兆网络 (100M)</strong></td>
<td align="left"><strong>双向4车道公路</strong></td>
<td align="left">只使用8根线里的<strong>4根</strong>（1, 2, 3, 6）来传输数据。另外4根是闲置的。</td>
<td align="left"><strong>Cat 5（五类线）</strong>就足够了。</td>
</tr>
<tr>
<td align="left"><strong>千兆网络 (1000M)</strong></td>
<td align="left"><strong>双向8车道公路</strong></td>
<td align="left"><strong>8根线必须全部使用</strong>，而且技术更先进，每对线都能同时收发数据。</td>
<td align="left">至少需要 <strong>Cat 5e（超五类）</strong>，推荐 <strong>Cat 6（六类）</strong>。</td>
</tr>
</tbody></table>
<p><strong>关键点：</strong>如果你用一条只有4根芯线能通的老旧或劣质网线（比如某些只有4芯的电话线冒充的网线），那么即使你的电脑和路由器是千兆的，速度也会被限制在百兆。因为“路面”只有4条车道，无法满足8车道同时通车的需求。</p>
<hr>
<p>如何识别一条“千兆网线”？（看路面的“等级标号”）</p>
<p>最可靠的方法就是看网线外皮上印刷的<strong>文字</strong>。</p>
<ol>
<li><strong>寻找“CAT”字样</strong>：**<code>CAT 5e</code><strong>或 <strong><code>CAT 5E</code><strong>：这是</strong>超五类线</strong>，是千兆网络的</strong>入门标准<strong>。在100米距离内能稳定支持千兆网络。这是目前最常见、性价比最高的选择。</strong><code>CAT 6</code><strong>：这是</strong>六类线<strong>，标准更高。它内部通常带一个“十字骨架”（如下图），用来更好地隔离4对线，减少串扰。它不仅完美支持千兆（1000M），还能支持更高速的</strong>万兆（10G）网络<strong>（但距离较短，约55米）。</strong>未来几年内，这是更好的选择。****<code>CAT 6A</code>**（超六类）、<code>CAT 7</code>等：支持更高速率（如万兆到100米），一般家庭目前用不到，多见于数据中心。</li>
<li><strong>看水晶头</strong>：虽然不绝对，但千兆网线的水晶头，<strong>8个金属触点必须是齐全的、镀金的</strong>，看起来做工更扎实。百兆网线有些劣质的水晶头可能触点材质很差，甚至只有4个触点。</li>
</ol>
<hr>
<p>千兆网线的内在要求：为什么Cat 5e以上才能当千兆网线？</p>
<p>要达到“千兆标准”，这条“路面”必须在以下几个方面达标：</p>
<ol>
<li><strong>材质纯度（路面材质）</strong>：必须使用<strong>无氧铜</strong>，电阻小，信号损耗低。劣质线会用铜包铝、铜包铁，电阻大，信号衰减严重，轻则降速，重则断网。</li>
<li><strong>双绞密度（车道的平整度）</strong>：网线里的8根线是两两相绞成4对的。绞合的密度越高，抗电磁干扰的能力就越强。Cat 6线的绞合密度通常比Cat 5e更高。</li>
<li><strong>屏蔽性能（公路的隔音墙）</strong>：在电磁干扰强的环境（比如旁边有强电线），需要使用<strong>屏蔽线</strong>。屏蔽线外有一层金属箔或编织网，像隔音墙一样保护内部信号。家用一般用<strong>非屏蔽线（UTP）</strong>就够了。</li>
</ol>
<hr>
<p>总结与选购建议</p>
<table>
<thead>
<tr>
<th align="left">线缆类型</th>
<th align="left">最大频率</th>
<th align="left">支持的最高速率（理想条件下）</th>
<th align="left">推荐场景</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Cat 5</strong></td>
<td align="left">100 MHz</td>
<td align="left">100 Mbps（百兆）</td>
<td align="left"><strong>已淘汰</strong>，不要购买。</td>
</tr>
<tr>
<td align="left"><strong>Cat 5e</strong></td>
<td align="left">100 MHz</td>
<td align="left">1000 Mbps（千兆）</td>
<td align="left"><strong>家庭主流选择</strong>，性价比高，完全满足千兆需求。</td>
</tr>
<tr>
<td align="left"><strong>Cat 6</strong></td>
<td align="left">250 MHz</td>
<td align="left">1 Gbps（100米）/ 10 Gbps（55米）</td>
<td align="left"><strong>追求品质和未来性的选择</strong>，抗干扰更好，为万兆留有余地。</td>
</tr>
<tr>
<td align="left"><strong>Cat 6A/7</strong></td>
<td align="left">500 MHz+</td>
<td align="left">10 Gbps（100米）</td>
<td align="left">家庭极客、NAS重度用户、小型企业。</td>
</tr>
</tbody></table>
<p>有时候这 AI 的理解要比绝大多数网站内容靠谱些。</p>
<blockquote>
<p>2025 年 11 月 7 日</p>
</blockquote>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs">现在要采购一条网线，预计下周就要去现场调试设备了，得用自己的电脑连接高速收费站的费用显示器，在车道处调试下，现在需要我买一条网线，用电脑连接费显等设备时，得额外用一个USB转接口把笔记本和设备连接起来。<br><br>现在的问题是，网线应该买什么规格的，USB转接口呢，你推荐一下，今下午下班后我就买京东快递，明天就回来了。<br></code></pre></td></tr></table></figure>

<p>核心采购清单（今晚下单，明天送达）</p>
<table>
<thead>
<tr>
<th align="left">物品名称</th>
<th align="left">规格要求</th>
<th align="left">推荐理由</th>
<th align="left">京东关键词示例</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. 网线</strong></td>
<td align="left"><strong>超五类类或六类非屏蔽网线</strong>，长度建议 <strong>3米或5米</strong>（预留操作空间）</td>
<td align="left">超五类（Cat5e）或六, 完全足以应对千兆网络，是性价比最高的选择。非屏蔽型号（UTP）柔软易用，完全满足现场调试环境。3-5米长度足以在车道旁灵活操作。</td>
<td align="left">“六类网线 3米” “超五类网线 5米”</td>
</tr>
<tr>
<td align="left"><strong>2. USB转网口转换器</strong></td>
<td align="left"><strong>USB Type-C转RJ45千兆网口转接头</strong>（务必确认接口与您笔记本匹配）</td>
<td align="left">这是关键设备！绝大多数现代轻薄本已取消RJ45网口，必须靠它转换。<strong>千兆</strong>是标准配置，[基本知识] 务必选择品牌货以保证驱动兼容性和稳定性，避免“三无”产品。</td>
<td align="left">“USB转网口转换器 千兆” “Type-C转RJ45”</td>
</tr>
</tbody></table>
<p>请立刻检查您笔记本电脑的接口类型，是传统的USB-A口（扁长型）还是USB-C口（椭圆形）。据此选择对应的转换器！</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-string">我的笔记本是</span> <span class="hljs-string">Lenovo</span> <span class="hljs-string">XiaoXinPro</span> <span class="hljs-string">16lHU</span> <span class="hljs-number">2021</span><span class="hljs-string">，你给看下如果要买转接口，应该买什么样接口类型的。</span><br></code></pre></td></tr></table></figure>

<p>好的，我们来快速准确地确定您需要的转接口类型。</p>
<p>根据您的笔记本电脑型号 **联想小新Pro 16 2021款 (16lHU)**，我们可以直接锁定它的接口规格。</p>
<p>您需要购买 <strong>Type-C 转 RJ45 网口转换器</strong></p>
<p><strong>详细说明和选购建议：</strong></p>
<ol>
<li>1.<strong>接口确认</strong>：您2021款的小新Pro 16，机身上配备的是 <strong>USB Type-C 接口</strong>。这个接口是椭圆形的，并且支持充电、数据传输和视频输出。因此，您必须选择 <strong>USB-C 转 RJ45</strong> 的转换器。</li>
<li>2.<strong>关键参数</strong>：务必选择 <strong>千兆（1000Mbps）</strong> 型号。百兆（100M）的已经过时，无法满足现代网络设备调试的需求。</li>
<li>3.<strong>选购关键词（用于京东搜索）</strong>： •<code>Type-C 转网口</code> •<code>USB-C 转 RJ45 千兆</code> •<code>扩展坞 千兆网口</code>（如果您未来还需要连接U盘或显示器，可以考虑功能更多的扩展坞，但目前仅转网口的小转接头更便宜便携）</li>
</ol>
<p><strong>您的最终采购清单（今晚京东下单）：</strong></p>
<table>
<thead>
<tr>
<th>物品</th>
<th>为 小新Pro 16 2021款 精准匹配的规格</th>
</tr>
</thead>
<tbody><tr>
<td><strong>USB转网口转换器</strong></td>
<td><strong>Type-C 转 RJ45 千兆网口转接头</strong></td>
</tr>
<tr>
<td><strong>网线</strong></td>
<td><strong>六类（Cat6）或超五类（Cat5e）非屏蔽网线，长度3-5米</strong></td>
</tr>
</tbody></table>
<p>现在就可以打开京东APP或网站，直接搜索 <strong>“Type-C 转千兆网卡”</strong>，选择一个销量高、评价好的品牌（如绿联、毕亚兹、飞利浦等），今天下单，明天就能送达。</p>
<p>确保这个转接头能在您的电脑上正常识别，是明天现场调试成功的第一步。祝顺利！</p>
<p><a target="_blank" rel="noopener" href="https://www.1688.com/zhuti/-757362CFDFD7AACDF8BFDACFDF.html">usb线转网口线-usb线转网口线厂家、品牌、图片、热帖-阿里巴巴</a></p>
<p><a target="_blank" rel="noopener" href="https://www.1688.com/zhuti/-757362D7AABBBBCFDFCDF8CFDF.html?from=ye&bizId=yichang.1688.com&no_cache=false">usb转换线网线-usb转换线网线厂家、品牌、图片、热帖-阿里巴巴</a></p>
<h2 id="虚拟机"><a href="#虚拟机" class="headerlink" title="虚拟机"></a>虚拟机</h2><blockquote>
<p>2025 年 11 月 10 日</p>
</blockquote>
<p>查看虚拟机磁盘空间大小。</p>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">dh</span><br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/insomina/p/13181841.html">linux命令：查看空间（内存、磁盘、文件目录、分区） - 子非鱼灬亦非我 - 博客园</a></p>
<p><a target="_blank" rel="noopener" href="https://www.jb51.net/server/3525860hz.htm">Linux使用du和sort命令查找最大文件和目录_Linux_脚本之家</a></p>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">clear<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/2060917">Linux的清屏命令(linux终端清屏)-腾讯云开发者社区-腾讯云</a></p>
<blockquote>
<p>2025 年 11 月 5 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/red_sky_blue/article/details/151570522">vmware workstation pro 17激活码_vmware workstation17密钥-CSDN博客</a></p>
<figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">You <span class="hljs-built_in">do</span> <span class="hljs-keyword">not</span> have permission <span class="hljs-built_in">to</span> enter <span class="hljs-keyword">a</span> license key. Try again <span class="hljs-keyword">using</span> <span class="hljs-keyword">the</span> <span class="hljs-keyword">system</span> administrator account.<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/GryphonRiders/p/18919782">虚拟机VMware17安装包免费下载及安装激活教程（附激活密钥） - 影武浮云 - 博客园</a></p>
<p>最新的许可证密钥：</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">NZ4RR</span>-FTK5H-H81C1-Q30QH-<span class="hljs-number">1</span>V2LA<br><span class="hljs-attribute">4A4RR</span>-<span class="hljs-number">813</span>DK-M81A9-<span class="hljs-number">4</span>U35H-<span class="hljs-number">06</span>KND<br><span class="hljs-attribute">MC60H</span>-DWHD5-H80U9-<span class="hljs-number">6</span>V85M-<span class="hljs-number">8280</span>D<br><span class="hljs-attribute">JU090</span>-<span class="hljs-number">6039</span>P-<span class="hljs-number">08409</span>-<span class="hljs-number">8</span>J0QH-<span class="hljs-number">2</span>YR7F<br></code></pre></td></tr></table></figure>

<p><strong>问题解决：</strong></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_66221226/article/details/134483419">vmware 16无权输入密钥，联系管理员权限解决办法_you do not have permission to enter a license key.-CSDN博客</a></p>
<ol>
<li>工具栏搜索“cmd”找到命令提示符；</li>
<li>右击以管理员身份运行；</li>
<li>找到VMware安装目录，进入VMware的安装目录下的 x64 文件夹，复制地址。如下：</li>
</ol>
<p><img src="http://blog.memory-life.xyz/image-20251105151423148.png" alt="image-20251105151423148"></p>
<p> 在已打开的cmd中输入代码：</p>
<figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs vim"><span class="hljs-keyword">cd</span> /d d:<br> <br><span class="hljs-keyword">cd</span> D:\Program Files\XUNIJI\x64（这里以我的目录为例，将加粗部分改为你的VMware的安装目录即可）<br> <br>vmware-vmx.<span class="hljs-keyword">exe</span> --<span class="hljs-keyword">new</span>-<span class="hljs-keyword">sn</span> xxxx-xxxx-xxxx-xxxx（密钥内容：YF390-<span class="hljs-number">0</span>HF8P-M81RQ-<span class="hljs-number">2</span>DXQE-M2UT6）<br></code></pre></td></tr></table></figure>

<p>注意：cmd要以管理员身份运行，否则会导致命令无效。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /d d:<br> <br><span class="hljs-built_in">cd</span> D:\dev\VMware Workstation Pro 17.0 64位<br> <br>vmware-vmx.exe --new-sn NZ4RR-FTK5H-H81C1-Q30QH-1V2LA<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vmware.exe --new-sn NZ4RR-FTK5H-H81C1-Q30QH-1V2LA<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vmware-vmx.exe --new-sn xxxx-xxxx-xxxx-xxxx（密钥内容：YF390-0HF8P-M81RQ-2DXQE-M2UT6）<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20251105151908271.png" alt="image-20251105151908271"></p>
<p>测试完毕，执行这三条命令即可：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /d d:<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> D:\dev\VMware Workstation Pro 17.0 64位\x64<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vmware-vmx.exe --new-sn NZ4RR-FTK5H-H81C1-Q30QH-1V2LA<br></code></pre></td></tr></table></figure>

<p>顺利执行，不过没什么用，不起作用。</p>
<p>VMWare 17 虚拟机安装。</p>
<p><strong>本机 CentOS7 密码为 ：12345678。</strong></p>
<figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dns"><span class="hljs-number">12345678</span><br></code></pre></td></tr></table></figure>

<h2 id="边缘网关"><a href="#边缘网关" class="headerlink" title="边缘网关"></a>边缘网关</h2><blockquote>
<p>2025 年 11 月 25 日</p>
</blockquote>
<p>路段版本，顶部菜单。</p>
<p>架舱，设备检测，详情界面 -&gt; 资产基本信息，监测信息，告警信息，资产拓扑图（省二期），性能指标，指标排序。</p>
<p>收费站监测，数据传输总览，数据传输指标，交易数据完整性。</p>
<p>系统公告，运维管理，统计分析（车道门架运行监测排行榜），导出报表功能，版本监测。</p>
<p>基础管理，设备管理，资产管理。</p>
<blockquote>
<p>2025 年 10 月 30 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/RSU/9899937">RSU_百度百科</a></p>
<p><a target="_blank" rel="noopener" href="https://baike.baidu.com/item/MTC/5350472">MTC（人工与自动化设备协同运作的高速公路收费系统）_百度百科</a></p>
<p>RS232/RS485串口：RSU 天线控制器，MTC 读卡机，移动支付扫码枪，费额显示器，称重设备。</p>
<p>千兆以太网接口：车牌识别摄像机，车型识别，智能栏杆机，打印机，特情机。</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">以太网供电（Power <span class="hljs-keyword">over</span> Ethernet，简称PoE）也称PoE供电，是一种可以在以太网中透过双绞线来传输电力与数据到设备上的技术。<br></code></pre></td></tr></table></figure>

<figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gams">IC卡 (Integrated Circuit <span class="hljs-keyword">Card</span>，集成电路卡)，也称智能卡(Smart <span class="hljs-keyword">card</span>)、智慧卡(Intelligent <span class="hljs-keyword">card</span>)、微电路卡(Microcircuit <span class="hljs-keyword">card</span>)或微芯片卡等。<br></code></pre></td></tr></table></figure>

<figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs scss">CPC卡的英文全称Compound Pass <span class="hljs-built_in">Car</span>(复合通行卡)，主要用于高速公路收费系统中记录车辆行驶路径和计费信息。 ‌<br><br></code></pre></td></tr></table></figure>

<p>收费站主要设备包括站级服务器、车道设备以及称重设备，应满足本章设备技术要求，同时应充分考虑国家安全战略要求及新技术发展和应用，实现联网收费系统安全、稳定、高效运行。 </p>
<p>车道设备主要包括RSU、高清车牌图像识别设备、车型识别设备、电动栏杆机、车辆检测器、信息显示屏、手持终端、移动支付终端、自助发卡设备、 自助交费设备、车道控制器、非接触IC卡读写器等。若采用集成化设备，集成 的设备模块均应满足本章设备技术要求</p>
<figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs scss">PCI是Peripheral Component <span class="hljs-built_in">Interconnect</span>(外设部件互连标准)的缩写，它是个人电脑中使用最为广泛的接口<br>PCL密码卡<br></code></pre></td></tr></table></figure>

<figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs fortran">PSAM（Purchase Secure <span class="hljs-keyword">Access</span> <span class="hljs-keyword">Module</span>）是销售点终端安全存取模块，符合中国金融集成电路（IC）卡规范，主要用于商用POS终端、网点终端等设备的安全控制管理，支持多级发卡机制和多应用环境。<br></code></pre></td></tr></table></figure>

<h2 id="出差"><a href="#出差" class="headerlink" title="出差"></a>出差</h2><blockquote>
<p>2025 年 11 月 30 日</p>
</blockquote>
<p>这周的花销。</p>
<p>千兆交换机，34.90 元；网线转换头，14.90 元；两条网线，17.43 元；公对母串口线延长线，35.90 元。</p>
<p>买设备一共花了 103.13 元。</p>
<p>周一没去，周二来回两趟车，分别花销 21.06 元，25.25 元；周三来回两趟车，分别花销 21.63 元，29.25 元；周四来回两趟车，分别花销 21.09 元，25.33 元；周五来回两趟车，分别花销 23.38 元，40.16 元；周六来回两趟车，分别花销 22.60 元，25.72 元。</p>
<p>打车一共花了 255.47 元。</p>
<p>截至今天，买设备一共花了 103.13 元 + 270.58 元 = 373.71 元，打车一共花了 164.08 元 + 255.47 元 = 419.55 元。</p>
<p>这个月开销差旅费开销，<strong>793.26 元</strong>。</p>
<blockquote>
<p>2025 年 11 月 24 日</p>
</blockquote>
<p>上周的花销还没算进去。</p>
<p>额外买了两根新串口线，各自花销 62.10 元，62.10元。</p>
<p>周一来回打了两趟车，分别花销 16.85 元 ，28.38 元；周三，周四，周五中午打了一趟车过去，各自花销 23.02 元，22.22 元，22.54 元；周六来回打了两趟车，分别花销 25.01 元，26.06 元。</p>
<p>串口屏 93.25 元，USB 转 TTL 模块 53.13 元。</p>
<p>直至今天，买设备花销 270.58 元，打车花销 164.08 元 ，共计花销 <strong>434.66</strong> 元。</p>
<p>妈的，项目预备金早都超支了，剩下的开始自己垫付了都，多付了 51.41 元。</p>
<blockquote>
<p>2025 年 11 月 18 日</p>
</blockquote>
<p>周三，截至目前，又买了两条串口线，打了两趟车，今天还得打两趟车，还买了一个串口屏，老贵了这个东西。</p>
<p>今下午结束后总结下花销。</p>
<blockquote>
<p>2025 年 11 月 16 日</p>
</blockquote>
<p>统计下过去两周多时间里的花销。</p>
<p>网线 16.71 块，网线-USB转接线 49.00 块，键盘 25.90 块，串口线 59.00 块，打印两张车牌 2 块。</p>
<p>打车费，周六来回打了两趟车，周日来回打了两趟车，花销分别是 21.37 元，29.76 元，21.37 元，24.29 元。</p>
<p>直到今晚，买设备花销 152.61 元，打车花销 96.79 元，共计花销 249.4 元。</p>
<p>得算清楚，算明白。</p>
<p>当时两千块的预备金还剩 632.65 元，现在还剩 <strong>383.25</strong> 元。</p>
<blockquote>
<p>2025 年 11 月 6 日</p>
</blockquote>
<p>高铁536元，打车175.46元，住宿655.89元，吃饭192.8元，共计1,560.15元。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">23</span>号晚，郑州二七鸿运宾馆，花销<span class="hljs-number">69</span>.<span class="hljs-number">84</span>元，未开票。<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">这个没算进去。<br></code></pre></td></tr></table></figure>

<p>住宿，高铁和打车的发票都开了。</p>
<p>替公司省钱，姜总额外补给自己300块。</p>
<p>公司现在的出差补助是50一天，包住宿、交通，吃饭自理，一共出差从24号到4号共12天，1,560.15 +600 - 192.8=1967.35。</p>
<p>我算一算。</p>
<p>项目预备金姜总当时给我打了两千块。</p>
<p>出差12天，出差每天补助50一共补助给我六百块，这是我应得的，拿到了。</p>
<p>替公司省钱，姜总额外补助给自己三百块，拿到了。</p>
<p>出差费用减去吃饭自理的花销，这是项目预备金真正开销的费用，一共是 1560.15 元 - 192.8 元 = 1,367.35 元。</p>
<p>这样算下来，自己一共拿了九百块补助，两千块的预备金还剩下 2000 元 - 1367.35 元 =  <strong>632.65 元</strong>。</p>
<p>这六百多就是可支配的项目预备金了。</p>
<blockquote>
<p>2025 年 11 月 5 日</p>
</blockquote>
<p>截至今天，差旅费花销又新增了几项。</p>
<p>3号晚，下班后高德打车去酒店，花销13.91元；晚上点美团外卖，花销16.3元；品苑清雅酒店住宿花销99.83元，开票九十九块。</p>
<p>4号，上午高德打车去濮阳东站，花销27.24元。</p>
<p>4号，下午一顿汤面花了十块钱，如果这顿饭也算差旅费的话，花销10元。</p>
<blockquote>
<p>2025 年 11 月 3 日</p>
</blockquote>
<p><strong>梳理下通勤费。</strong></p>
<p>24号，东站打计程车到濮阳高速路口，花销52.60元，开票六十块。</p>
<p>25号，退了品苑清雅酒店后打车到爱尚依家宾馆，花销10.48元。</p>
<p>26号，中午打车去品苑清雅酒店开住宿发票，来回花销分别为13.31元，11.75元。</p>
<p>27号，28号，30号，31号，11月3号，早上打车到高速路口，花销分别为7.77元，8.36元，7.06元，7.18元，7.2元。</p>
<p>29号，早上打计程车到高速路口，花销8.6元，开票十块。</p>
<p>长治东-郑州，郑州东-濮阳东，濮阳东-郑州东，郑州东-太原，花销分别为112.5元，93元，116元，214.5元，暂未开票。</p>
<p><strong>梳理下住宿费。</strong></p>
<p>23号晚，郑州二七鸿运宾馆，花销69.84元，未开票。</p>
<p>24号晚，品苑清雅酒店，花销100.89元，开票一百块。</p>
<p>25-30号共六晚，爱尚依家宾馆，花销210元，开票二百块。</p>
<p>31-3号共三晚，朝夕相处宾馆，花销245.17元，暂未开票。</p>
<p>截至3号午，通勤 + 住宿共计1296.21元。</p>
<p><strong>梳理下吃饭花了多少钱。</strong></p>
<p>24号午，一碗西红柿鸡蛋面，花销14元；24号晚，美团点外卖，花销15元；25号-3号，冯记面馆吃了八碗面，共计花销64元，砂锅店光顾四次，共计花销52元，跑过两次小卖部，共计花销20元，共享单车骑过一次，花销1.5元。</p>
<p>截至3号午，通勤 + 住宿共计1462.71元。</p>
<p>四点半，写完今天的工作日志。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs">11月3日<br>现场观摩：自动栏杆机在交易成功后短暂失灵；<br>车道出卡机未检测到车辆吐卡失败，由维护人员手动按卡机绿色按钮后正常出卡；<br>卡机刷子损坏读卡不稳定，短暂关闭该车道后维护处理；<br>车道内车辆停靠不当，交易完成启动车辆后车侧身剐蹭到收费岛防护栏。<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 10 月 31 日</p>
</blockquote>
<figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs moonscript"><span class="hljs-name">C</span>:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images<br></code></pre></td></tr></table></figure>

<p>  <img src="http://blog.memory-life.xyz/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20251030203845.jpg" alt="微信图片_20251030203845"></p>
<p><img src="http://blog.memory-life.xyz/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20251030203905.jpg" alt="微信图片_20251030203905"></p>
<p><img src="http://blog.memory-life.xyz/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20251030203908.jpg" alt="微信图片_20251030203908"></p>
<p><img src="http://blog.memory-life.xyz/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20251030203911.jpg" alt="微信图片_20251030203911"></p>
<p><img src="http://blog.memory-life.xyz/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20251030203913.jpg" alt="微信图片_20251030203913"></p>
<ol>
<li><strong>车辆驶入：</strong>压到<strong>地感线圈</strong>-&gt; 线圈产生信号 -&gt; 信号线传到<strong>黑色智能节点</strong>的<code>DI1</code>端子 -&gt; 节点通过网线告知<strong>白色网关</strong>-&gt; 网关启动交易流程。</li>
<li><strong>ETC交易：</strong>网关通知<strong>RSU控制器</strong>-&gt; 控制器通过射频线驱动<strong>RSU天线</strong>扫描 -&gt; 与车载OBU通信 -&gt; 交易数据经网关<code>WAN</code>口上传云端验证。</li>
<li><strong>放行：</strong>验证成功 -&gt; 网关通过网线命令<strong>智能节点</strong>-&gt; 节点通过<code>DO1</code>端子控制<strong>栏杆机</strong>抬杆，通过<code>DO2</code>端子控制<strong>信号灯</strong>变绿 -&gt; 同时，网关通过<code>LAN</code>口将金额发送到<strong>费额显示器</strong>显示。</li>
<li><strong>车辆离开：</strong>压到出口线圈 -&gt; 信号传至智能节点 -&gt; 节点控制栏杆落杆。</li>
</ol>
<p><img src="http://blog.memory-life.xyz/image-20251031101654181.png" alt="image-20251031101654181"></p>
<p>早上刚到就用 DeepSeek 分析收费岛核心网口布线逻辑。</p>
<p>贴一下这段解析吧。</p>
<p><strong>图2 &amp; 图3：机柜内部核心布局（对应地图中的白色网关、黑色节点）</strong></p>
<p>这两张图展示的是同一个机柜内部，角度略有不同，我们结合起来看。机柜布局从上到下非常清晰：</p>
<ol>
<li><strong>顶层：电源接入与分配区（图2顶部）****你看到的是：</strong>一排电源插座，上面插着多个黑色电源适配器。<strong>接线逻辑：</strong>这是整个机柜的“心脏”。市电进来后，通过这些插座和适配器，转换成各种设备需要的安全电压（如12V、24V），再通过下方的红线（火线）、蓝线（零线）分配到各个断路器和设备。<strong>“冰箱”那个标签可能是个趣称，可能指代某个大功率设备或就是个内部标记。</strong></li>
<li><strong>中层：网络通信核心 —— 白色边缘网关（图3中部）****你看到的是：</strong>那个白色的、有多个网口和指示灯的设备。<strong>这就是我上次说的“智慧边缘网关”，是整个车道的“大脑”，负责数据交换和上传。**<strong>网口分布与接线逻辑（对照地图看，这是重点！）：</strong></strong><code>WAN/UPLINK</code>口（图3，网关左侧的网口）：<strong>这个口通常有显著不同。在你图片里，它很可能就是那个连接着</strong>蓝色网线<strong>或者最粗网线的接口。</strong>这是通往收费站服务器的总上行线，是车道的生命线，绝对不能动！****<code>LAN</code>口（图3，网关右侧的多个网口）：<strong>这些口用于连接内部设备。根据常见配置：其中一个<code>LAN</code>口（比如<code>LAN1</code>）会接一根网线（比如灰色）到</strong>下层黑色“智能节点”<strong>（地图中的内部通信）。这就是“大脑”和“手脚”之间的神经。另一个<code>LAN</code>口（比如<code>LAN2</code>）会接一根网线到</strong>图4中的RSU控制器<strong>上。还会有一个<code>LAN</code>口预留给</strong>费额显示器**（图1/图5中的蓝色收费亭设备），网线会从机柜接到亭子里。</li>
<li><strong>下层：现场控制核心 —— 黑色“智能节点”（图2/3下部）****你看到的是：</strong>那个标有“智能节点”的黑色设备，下面有一排排接线端子（绿色和黄色），插满了红、黄、蓝等颜色的电线。<strong>接线逻辑（对照地图看，这是难点！）：****上行通信：</strong>它通过一根从上面白色网关来的<strong>网线</strong>（很可能是灰色）接收指令。<strong>数字量输入（DI）：</strong>端子排上标有<code>DI1</code>， <code>DI2</code>等字样的地方（图片中标签较小，但逻辑如此），接的是<strong>地感线圈</strong>的信号线。线圈检测到车辆，就给这里一个“通/断”信号。<strong>数字量输出（DO）：</strong>端子排上标有<code>DO1</code>， <code>DO2</code>等字样的地方，接的是<strong>自动栏杆机</strong>和<strong>车道信号灯</strong>的控制线。系统命令通过这里发出，控制栏杆抬起落下，信号灯红绿变化。</li>
</ol>
<p><strong>图4：RSU控制器与配电区（对应地图中的RSU控制器）</strong></p>
<p>这张图展示了机柜的另一个部分，通常是并排安装的。</p>
<ol>
<li><strong>顶部：配电断路器****你看到的是：</strong>两排“CHNT”品牌的微型断路器。<strong>接线逻辑：</strong>每个断路器控制一个回路。比如：一路给白色网关，一路给智能节点，一路给RSU控制器，一路给栏杆机，一路给费额显示器。<strong>你维护时操作某个设备，最好关闭对应的断路器，保证安全。</strong></li>
<li><strong>中部：RSU控制器****你看到的是：</strong>两个黑色的“RSU控制器”，上面有指示灯。这就是ETC通信的核心。<strong>接线逻辑（对照地图看）：****网络端：</strong>它通过一根<strong>网线</strong>（比如从白色网关的<code>LAN2</code>口来的蓝色网线）与“大脑”连接，传输交易数据。<strong>射频端：</strong>它背后有专用的射频接口，通过一根粗大的<strong>同轴电缆</strong>连接到车道顶棚或安全岛上的<strong>RSU天线</strong>（就是那个像平板一样的东西）。车辆OBU的信息就是通过这个链路收发。</li>
<li><strong>右侧：其他通信模块****你看到的是：</strong>灰色的模块，可能用于4G/5G备份通信或与收费站的其他系统交互。</li>
</ol>
<p>十点半去路口把接线看了一遍，杨工不懂，附近也没什么人懂，这网口接线本来就是出厂后由专业人员配置的，各司其职哪有外行闲着没事干去瞎琢磨。</p>
<p>在这里工作也是够闲的，看他们的工作氛围就能明显觉察到，幸福感挺高。</p>
<p>中午十二点多就走了。</p>
<p>妈的，下午六点，工作日志还没写。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">10</span>月<span class="hljs-number">31</span>日<br><span class="hljs-attribute">1</span>、现场观摩特情处理，车辆完成交易后电动栏杆未抬起；无牌车辆通行处理；卡机出卡卡死；一辆ETC车在出口车道交易时显示余额不足，引导司机将ETC卡从OBU上取下后，交由维护人员使用车道非接触IC卡读写器完成刷卡支付。<br><span class="hljs-attribute">2</span>、观察出口车道收费设备内部的布线逻辑，重点确认了读卡机、RSU天线、自动栏杆机和费额显示器设备的连接和通信状态，拍照保存。<br></code></pre></td></tr></table></figure>

<p>写完咯，连同设备图也打包好给发过去，周末愉快！</p>
<blockquote>
<p>2025 年 10 月 30 日</p>
</blockquote>
<p>提早写好工作日志。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">10</span>月<span class="hljs-number">30</span>日<br><span class="hljs-attribute">1</span>、现场观摩特殊情况处理：发卡机卡住没有正常出卡，快速断电重启设备后恢复正常；在ETC车道排队等候车辆的车载单元被旁边车道的RSU天线误读导致在本车道交易失败，引导该车辆倒车脱离感应区后重新驶入后，成功完成交易并抬杆放行；入口处后车跟车过近误将前车的通行卡取走，现场人员引导后车在安全区域等了<span class="hljs-number">10</span>分钟，待系统释放掉该卡的绑定信息后再重新进车道取卡。<br><span class="hljs-attribute">2</span>、查看高速联网收费系统技术方案文档，系统学习车道主要设备技术要求、标志标线和交通安全措施等。<br></code></pre></td></tr></table></figure>

<p>下午六点钟，刚吃完饭上楼进房间，打了两把游戏就看到姜总打来语音，明天得去高速路口拍设备接线和外形照片，回太原会提前通知。</p>
<blockquote>
<p>2025 年 10 月 29 日</p>
</blockquote>
<p>午饭前看完《交通运输部-高速公路联网收费系统优化升级收费站标准化专项试点技术方案附件》。</p>
<p>下午三点钟，昨天这个时候已经去高速路口收费站了。</p>
<p>下班前，写完今天的工作日志。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">10</span>月<span class="hljs-number">29</span>日：<br><span class="hljs-attribute">1</span>、现场观摩调整车道卡机处摄像头的监控角度，更准确捕捉车辆驶入和通行过程中的CPC卡取放操作。<br><span class="hljs-attribute">2</span>、学习车道设备与收费系统之间如何通过标准化的通信协议进行控制和数据交换的接口规范。<br></code></pre></td></tr></table></figure>

<p><a target="_blank" rel="noopener" href="https://gitcode.com/dcloud/unidocs-zh/edit/master/docs/quickstart-hx.md">GitCode - 全球开发者的开源社区,开源代码托管平台</a></p>
<blockquote>
<p>2025 年 10 月 28 日</p>
</blockquote>
<p>今早问了通信机房有没有可供连接的设备，没有。</p>
<p>杨师傅刚给发了机器人和外场的日志，可以看过车的逻辑和交易的逻辑。</p>
<p>下午三点钟跟杨工去高速收费站处，在路口一直呆到四点半左右才返回上楼，观摩并记录了一些现场车辆通行出入口的特殊情况。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">划防盗栏，卡机刷子，无卡过人工通道，卡太厚出不来，调整摄像头角度，出卡慢问题，无车牌处理，称重信息缺失，牵引车强制查验，排查摄像头问题，识别不到车辆，手动按绿色按钮弹出卡机<br></code></pre></td></tr></table></figure>

<p>下班前工作日志写个大概：</p>
<figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs avrasm"><span class="hljs-number">10</span>月<span class="hljs-number">28</span>日<br><span class="hljs-number">1</span>、现场观摩车辆在收费站出入口通行特情处理，包括无车牌人工处理、卡机刷子损坏导致读卡不稳定、<span class="hljs-keyword">CPC</span>卡太厚卡在出口出不来、货车剐蹭防护栏等。<br><span class="hljs-number">2</span>、观察到导致卡机出卡慢有诸多原因，如卡盒内<span class="hljs-keyword">CPC</span>卡排列不齐、卡片过厚、初始化卡片信息时网络拥堵、感应线圈触发信号延迟等。<br><span class="hljs-number">3</span>、查看车道系统平台的日志区域了解车辆通行和缴费交易的逻辑。<br><span class="hljs-number">4</span>、查看高速联网收费系统技术方案文档，系统学习出入口车道关键业务流程、站级交易系统功能模块、车道布局等。<br></code></pre></td></tr></table></figure>

<p>高速收费站入口处，卡机出卡慢会是什么原因导致的，扫描到车辆信息后需要做什么比对才能绑定什么信息来着，你给讲一讲。</p>
<p>DeepSeek 回答挺详细专业，学习一下：</p>
<p>好的，没问题！您这个问题问得非常专业，是高速公路收费系统运维中很常见的一个问题。我来给您详细拆解一下。</p>
<p><strong>卡机出卡慢的常见原因</strong></p>
<p>卡机（自动发卡机）出卡慢，就像打印机卡纸一样，是由多种因素造成的。我们可以从硬件、软件、外部环境三个层面来分析：</p>
<p><strong>1. 硬件问题（最常见）</strong></p>
<ul>
<li><strong>卡盒问题</strong>：卡盒没有安装到位，或者卡盒内的通行卡数量太少、排列不整齐，导致取卡机械臂无法顺利吸起或抓取卡片。</li>
<li><strong>机械结构磨损/故障</strong>：发卡机的核心部件是取卡臂、传送轮等机械装置。长期使用后，可能会出现磨损、松动、或者有灰尘、油污堆积，导致动作不顺畅、卡顿。</li>
<li><strong>传感器故障</strong>：发卡机内部有多个光学或机械传感器，用于检测卡盒是否有卡、卡片是否被成功抓取、卡片是否运送到出卡口等。任何一个传感器失灵或脏污，都会导致系统误判，从而反复尝试或停止出卡流程，造成延迟。</li>
<li><strong>卡片本身问题</strong>：通行卡变形、弯曲、过厚或过薄，也会在传送过程中遇到阻力。</li>
</ul>
<p><strong>2. 软件与系统问题</strong></p>
<ul>
<li><strong>系统响应延迟</strong>：当车辆驶入触发线圈后，触发信号需要经过工控机上传到收费站级的服务器，甚至可能要与省中心的系统进行短暂的通信，以获取时间、站号等信息来初始化一张卡片。如果网络拥堵或服务器处理能力达到瓶颈，这个响应过程就会变慢。</li>
<li><strong>软件BUG或死机</strong>：发卡机的控制软件可能出现临时性的错误，需要“反应”一下，或者工控机本身运行了太多程序，导致资源不足。</li>
</ul>
<p><strong>3. 外部环境因素</strong></p>
<ul>
<li><strong>触发线圈灵敏度</strong>：埋设在车道下的感应线圈可能因为损坏或参数漂移，导致检测车辆不灵敏，触发信号延迟，从而让整个出卡流程的启动就慢了半拍。</li>
<li><strong>天气因素</strong>：在极端的潮湿、寒冷或炎热天气下，电子元件和机械结构的性能可能会受到影响。</li>
</ul>
<p><strong>简单总结一下处理思路</strong>：如果遇到某台卡机出卡慢，运维人员通常会先检查卡盒和卡片，然后清洁传感器和传送路径，最后再排查软件日志和网络连接。</p>
<hr>
<p><strong>扫描车辆信息后的比对与绑定流程</strong></p>
<p>您问的这个问题，正是目前高速公路收费系统从 <strong>“计重收费”</strong> 向 <strong>“车型收费”</strong> 转变的核心，主要应用于ETC和CPC卡（复合通行卡）的入口流程。</p>
<p>当车辆驶入车道，摄像头（以及可能的其他辅助设备）会扫描捕捉车辆信息，主要包括：<strong>车牌号码、车牌颜色、车辆外观（用于AI识别车型）。</strong></p>
<p>系统捕捉到这些信息后，会进行一系列快速的比对和绑定，以确保后续计费的准确性。</p>
<p><strong>需要比对的信息清单：</strong></p>
<ol>
<li><strong>与部级/省级数据库比对（核心比对）</strong> <strong>比对对象</strong>：全国ETC客户服务系统或省级数据库中的车辆档案。 <strong>比对内容</strong>： <strong>车牌号</strong>：识别出的车牌号是否真实有效。 <strong>车牌颜色</strong>：蓝牌、黄牌、绿牌等，不同颜色代表不同的车辆类型（如客车、货车、新能源车等）。 <strong>车辆特征（车型分类）</strong>：这是最关键的一步。系统会用AI图像识别技术判断车辆的实际物理特征（如车轴数、车头高度、轮廓等），并与数据库中该车牌登记的<strong>标准车型</strong>进行比对。 <strong>目的</strong>：防止“大车小标”（例如，实际是三类货车，但办理ETC时登记为二类车，以少交通行费）。如果识别出的车型与数据库登记的车型不一致，系统会标记异常，在出口时可能会转为人工核查，按实际车型收费。</li>
<li><strong>与黑名单/状态名单比对</strong> <strong>比对对象</strong>：状态名单系统（包括黑名单、挂失卡、支付账户异常等名单）。 <strong>比对内容</strong>：该ETC车辆或CPC卡是否被列入异常名单。 <strong>目的</strong>：如果车辆在黑名单中，入口栏杆不会抬起，或者系统会提示工作人员进行干预。</li>
</ol>
<p><strong>绑定什么信息？</strong></p>
<p>在完成上述比对且无误后，系统会生成一条入口流水记录，并将以下信息<strong>绑定</strong>在一起，写入即将发放的<strong>CPC卡</strong>或<strong>ETC交易记录</strong>中：</p>
<ul>
<li><strong>入口信息</strong>：入口收费站编号、入口时间、车道号、操作员号。</li>
<li><strong>车辆信息</strong>：<strong>车牌号码</strong>、<strong>识别出的车型</strong>（作为计费依据）。</li>
<li><strong>卡片信息</strong>：CPC卡的内部序列号。</li>
</ul>
<p><strong>简单来说，这个绑定的过程就是：</strong> 把 <strong>“谁（车牌车型）”</strong>、<strong>“在哪儿上的（入口站）”</strong>、<strong>“什么时候上的（入口时间）”</strong>、<strong>“用的哪张卡（卡号）”</strong> 这几条信息打包成一个数据包。</p>
<p><strong>后续流程：</strong></p>
<ul>
<li>对于<strong>ETC车辆</strong>，这个数据包会通过RSU（路侧天线）写入OBU（车载单元），然后抬杆放行。</li>
<li>对于<strong>非ETC车辆（取CPC卡）</strong>，这个数据包会写入CPC卡中，然后卡机才吐卡。司机拿到的CPC卡里，已经存储了所有这些信息。在出口时，读卡器会读取这些信息，结合出口信息，计算出准确的通行费。</li>
</ul>
<blockquote>
<p>2025 年 10 月 27 日</p>
</blockquote>
<p>上网找找资料看。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_55366265/article/details/151808585">高速公路收费系统工程应用软件技术方案-CSDN博客</a></p>
<p>下午，姜总补发了两份项目文档，可供参考学习。</p>
<p>《智能边缘网关产品研发技术方案V1.1》《交通运输部-高速公路联网收费系统优化升级收费站标准化专项试点技术方案附件》。</p>
<p>晚八点钟，补上今天的工作日志。</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">10</span>月<span class="hljs-number">27</span>日<br><span class="hljs-attribute">1</span>、杨师傅详细解答收费站入口处地感线圈如何在车辆驶过后，触发三目摄像头抓拍车牌和车型识别，并发出是否有车信号控制栏杆上抬下落的，介绍各环节如何衔接。<br><span class="hljs-attribute">2</span>、人工收费车道出现了车主准备取卡，而读卡机发生故障卡死没有正常吐出通行卡的问题，观摩了现场维护人员打开设备机柜快速重启硬件后让卡机出卡正常；此外杨师傅简单描述了无牌车、车牌识别错误等情况的现场处理流程。<br><span class="hljs-attribute">3</span>、学习智能边缘网关产品研发技术方案，初步了解高速公路收费系统的整体硬件架构、软件架构以及标准化设计原则。<br></code></pre></td></tr></table></figure>

<blockquote>
<p>2025 年 10 月 24 日</p>
</blockquote>
<p>27号晚，补上24号的工作日志。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs">10月24日<br>跟杨师傅去到高速路口收费站现场，认识了ETC天线、读卡发卡机、车牌识别摄像机、自动栏杆机和费用显示器等外部核心设备，了解到来往车辆从入站识别、计费收费到抬杆放行的基本流程。<br></code></pre></td></tr></table></figure>

<p>晚上住一晚酒店，接下来的两天周末可以好好休息了。</p>
<h1 id="河南"><a href="#河南" class="headerlink" title="河南"></a>河南</h1><blockquote>
<p>2025 年 10 月 27 日</p>
</blockquote>
<p>在河南濮阳的第四天，上周五下午到了濮阳站高速路口，在附近度假区订了六晚的民宿一直呆到今天。</p>
<p>没什么好聊的，已经在日记里吐槽过了。</p>

                
              </div>
            
            <hr/>
            <div>
              <!-- 文章页面 - 底部标签 -->
<div class="post-metas my-3">
  
  <div class="post-meta mr-3 d-flex align-items-center">
    <i class="iconfont icon-category"></i>
    <!-- 归档页 - 文章列表 -->


<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/blog/categories/%E4%BB%A3%E7%A0%81%E9%94%8B%E8%8A%92/" class="category-chain-item">代码锋芒</a>
  
  
    <span>></span>
    
  <a href="/blog/categories/%E4%BB%A3%E7%A0%81%E9%94%8B%E8%8A%92/%E9%83%A8%E7%BD%B2%E4%B9%8B%E9%81%93/" class="category-chain-item">部署之道</a>
  
  
    <span>></span>
    
  <a href="/blog/categories/%E4%BB%A3%E7%A0%81%E9%94%8B%E8%8A%92/%E9%83%A8%E7%BD%B2%E4%B9%8B%E9%81%93/%E8%81%8C%E8%B7%AF%E6%98%9F%E7%81%AB/" class="category-chain-item">职路星火</a>
  
  

  

  

      </span>
    
  
</span>

  </div>
   
  <div class="post-meta">
    <i class="iconfont icon-tags"></i>
    
    <a href="/blog/tags/%E5%B7%A5%E4%BD%9C/">#工作</a>
    
    <a href="/blog/tags/%E6%97%A5%E8%AE%B0/">#日记</a>
    
  </div>
  
</div>


              <!-- 文章页面 - 底部标签下方 -->

  
  <div class="license-box my-3">
    <div class="license-title">
      <div>保驾护航——后台运维视角下的高速公路“生命线”</div>
      <div>https://test.atomgit.net/blog/2025/10/23/保驾护航——后台运维视角下的高速公路“生命线”/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>Memory</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2025年10月23日</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>更新于</div>
          <div>2025年12月4日</div>
        </div>
      
      
        <div class="license-meta-item">
          <div>许可协议</div>
          <div>
            
              
              
                <a target="_blank" href="https://creativecommons.org/licenses/by/4.0/">
                  <span class="hint--top hint--rounded" aria-label="BY - 署名">
                    <i class="iconfont icon-by"></i>
                  </span>
                </a>
              
            
          </div>
        </div>
      
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/blog/2025/11/14/%E6%B5%AE%E7%94%9F%E8%8B%A5%E6%A2%A6%EF%BC%9A%E5%8D%8A%E9%86%92%E7%9A%84%E4%BD%99%E9%9F%B5%E6%98%AF%E6%84%8F%E8%AF%86%E6%B5%81%E5%8A%A8%E7%9A%84%E5%BD%A2%E7%8A%B6/" title="浮生若梦：半醒的余韵是意识流动的形状">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">浮生若梦：半醒的余韵是意识流动的形状</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/blog/2025/10/12/%E8%AF%BB%E4%B9%A6/" title="读书">
                        <span class="hidden-mobile">读书</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            <!-- 文章页 - 评论上方 -->

  
  
    <article id="comments">
      
  <div id="valine"></div>
  <script type="text/javascript">
    Fluid.utils.loadComments('#valine', function() {
      Fluid.utils.createScript('https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js', function() {
        var options = Object.assign(
          {"appId":"T1hUHH9Ks1ggG9DBE3HgUPpV-gzGzoHsz","appKey":"XFkgzzvzNo3J3uNCbBiSOFKc","path":"window.location.pathname","placeholder":"填取QQ号和邮箱后评论，支持读取头像及消息提醒，留下点什么叭... ᶘ ᵒᴥᵒᶅ","avatar":"Gravatar","meta":["nick","mail","link"],"requiredFields":[],"pageSize":10,"lang":"zh-CN","highlight":true,"recordIP":false,"serverURLs":"https://t1huhh9k.lc-cn-n1-shared.com","emojiCDN":null,"emojiMaps":null,"enableQQ":true,"master":"8c9b6d6637904da62d74d019cc6982de","friends":"0188229a9cfc284176ea9135cb9514cc","visitor":true},
          {
            el: "#valine",
            path: window.location.pathname,
            app_id: "",
            app_key: "",
            placeholder: "填取QQ号和邮箱后评论，支持读取头像及消息提醒，留下点什么叭... ᶘ ᵒᴥᵒᶅ",
            avatar: "Gravatar",
            meta: ["nick","mail","link"],
            pageSize: "10",
            lang: "zh-CN",
            highlight: true,
            recordIP: false,
            serverURLs: "https://t1huhh9k.lc-cn-n1-shared.com",

            // 设置Bilibili表情包地址
            emojiCDN: '//i0.hdslb.com/bfs/emote/', 
            // 表情title和图片映射
            emojiMaps: {
                "tv_白眼": "48f75163437445665a9be80bb316e4cb252c5415.gif@48w_48h.webp",
                "tv_doge": "302d6c88c63ed162c81a49cafe7ed2709e6fb955.gif@48w_48h.webp",
                "tv_坏笑": "5d2572efd09aab5dde9e2a198bb3f9ac1e2a982e.gif@48w_48h.webp",
                "tv_难过": "9c6b41008a67755410f712334c64313df5f91b3f.gif@48w_48h.webp",
                "tv_生气": "1902a5a2df5b5c931d88c12f0feb264b1e109d0d.gif@48w_48h.webp",
                "tv_委屈": "af5a5853edb43a8178a8cb5df707fa5e88143699.gif@48w_48h.webp",
                "tv_斜眼笑": "c66568b471192ca1f62f6ed4384dc1b283ab7508.gif@48w_48h.webp",
                "tv_呆": "d3fa91e4db9215eb1e20ab9da44f1214aa4bda7b.gif@48w_48h.webp",
                "tv_发怒": "3959eb81b952e4fa8d269d98f9e3639172d84073.gif@48w_48h.webp",
                "tv_呕吐": "db58e9442aae26694af18cc1683607cca3a16763.gif@48w_48h.webp",
                "tv_思考": "b63f9146bfd985af014f8d6d4bdb498805be48f9.gif@48w_48h.webp",
                "tv_微笑": "b98656855d782f61cb8edc7f7fca6563ecafff7e.gif@48w_48h.webp",
                "tv_疑问": "fce1b1a0f3b0e39a2dc16a18508dba7b91e929f4.gif@48w_48h.webp",
                "tv_大哭": "cba61f05f3039b02a7ffc0dfcd9d7995df9fdd74.gif@48w_48h.webp",
                "tv_鼓掌": "be106e6b265883a9f28fbe10f7b765701e2618d4.gif@48w_48h.webp",
                "tv_抠鼻": "696d9f93e722144dc2a78aeffc569418fdf3d565.gif@48w_48h.webp",
                "tv_亲亲": "3534ea44ab74bd20352b88c245a06c4b4c46d271.gif@48w_48h.webp",
                "tv_调皮": "fcd967395fd14e4dd5829fa7e8a967ce23205e52.gif@48w_48h.webp",
                "tv_笑哭": "1c2fd1e8c9dde12812f86e5d4cbddd8993d98082.gif@48w_48h.webp",
                "tv_晕": "030040ec5c9ddc9e3d067658c4139e7314ab42f8.gif@48w_48h.webp",
                "tv_点赞": "30ecff401245fb56bcc1cf588d1809ac1ab1607c.gif@48w_48h.webp",
                "tv_害羞": "411a3e459e8580f5bfd9f639a408247c4b509935.gif@48w_48h.webp",
                "tv_睡着": "3c8b5e293261287a6203597e29b3de07df4d18c6.gif@48w_48h.webp",
                "tv_色": "a0c6d99ab0ab63b8648f5283ff72cec04b604828.gif@48w_48h.webp",
                "tv_吐血": "e17e4539e169d14a3389ff147afea760cebe5de5.gif@48w_48h.webp",
                "tv_无奈": "eb4cb5f07cfd177c7e6a7914316717e56d9cc1d0.gif@48w_48h.webp",
                "tv_再见": "344f61609ecce2008520dc8a977b6169215748a9.gif@48w_48h.webp",
                "tv_流汗": "390bccec65eaff536bd5bb2a0c5b8b0bdea47334.gif@48w_48h.webp",
                "tv_偷笑": "7f11e6f7f63e79112b833bd41fa13a83d7cd8474.gif@48w_48h.webp",
                "tv_抓狂":"a476b93ecd8e94ac3257323fd822f91cef212de2.gif@48w_48h.webp",
                "tv_黑人问号":"b609adf664be33224a9923262031165ae3e34cd2.gif@48w_48h.webp",
                "tv_困":"91c2bf34ecf842d7016c01d841db3d4074bd281f.gif@48w_48h.webp",
                "tv_打脸":"b0fad4856e59c1240e448437da3287bb5ce547e5.gif@48w_48h.webp",
                "tv_闭嘴":"a3fc5388b09e945be3f18fe23bfed5874a0285b7.gif@48w_48h.webp",
                "tv_鄙视":"293b5d459e6264ecf314d20937a936fa672ccd1e.gif@48w_48h.webp",
                "tv_腼腆":"30984e8264324f901d19bea85dada7103b695534.gif@48w_48h.webp",
                "tv_馋":"2525c5703c594e5f0752f68db8948773caebde47.gif@48w_48h.webp",
                "tv_可爱":"f92d20f76258bc5f33fc9d7c5e2a1d41fef19a7c.gif@48w_48h.webp",
                "tv_发财":"76131e52c9b033681b4c896c6024d29ef7ec7ec2.gif@48w_48h.webp",
                "tv_生病":"beb94829fe04f1a41bd6ca611e1f6ca9ca169afa.gif@48w_48h.webp",
                "tv_流鼻血":"8ef473f74a849420da712487b2f56ecca1f695f5.gif@48w_48h.webp",
                "tv_尴尬":"e0b84ef5ee3e5b8978e584c7c5a6550c51d15f84.gif@48w_48h.webp",
                "tv_大佬":"14ca0c05382b8741940942b2430b7a8d55c02f7e.gif@48w_48h.webp",
                "tv_流泪":"7e71cde7858f0cd50d74b0264aa26db612a8a167.png@48w_48h.webp",
                "tv_冷漠":"b9cbc755c2b3ee43be07ca13de84e5b699a3f101.png@48w_48h.webp",
                "tv_皱眉":"72ccad6679fea0d14cce648b4d818e09b8ffea2d.png@48w_48h.webp",
                "tv_鬼脸":"0ffbbddf8a94d124ca2f54b360bbc04feb6bbfea.png@48w_48h.webp",
                "tv_调侃":"4bc022533ef31544ca0d72c12c808cf4a1cce3e3.png@48w_48h.webp",
                "tv_目瞪口呆":"0b8cb81a68de5d5365212c99375e7ace3e7891b7.png@48w_48h.webp",
            },

            master: "8c9b6d6637904da62d74d019cc6982de",
            friends: "0188229a9cfc284176ea9135cb9514cc",
            tagMeta: ["博主","友人","访客"],
            visitor: true // 阅读量统计
          }
        )
        new Valine(options);
        Fluid.utils.waitElementVisible('#valine .vcontent', () => {
          var imgSelector = '#valine .vcontent img:not(.vemoji)';
          Fluid.plugins.imageCaption(imgSelector);
          Fluid.plugins.fancyBox(imgSelector);
        })
      });
    });
  </script>
  <noscript>Please enable JavaScript to view the comments</noscript>


    </article>
  


          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      <!-- 文章页面 - 右侧目录 -->

  <aside class="sidebar" style="margin-left: -1rem">
    <!-- 文章页面 - 右侧目录上方 -->
<div id="toc">
  <p class="toc-header">
    <i class="iconfont icon-list"></i>
    <span>目录</span>
  </p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>



    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <!-- 博客 - 搜索框 -->
<div
  class="modal fade"
  id="modalSearch"
  tabindex="-1"
  role="dialog"
  aria-labelledby="ModalLabel"
  aria-hidden="true"
>
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">
          搜索
        </h4>
        <button
          type="button"
          id="local-search-close"
          class="close"
          data-dismiss="modal"
          aria-label="Close"
        >
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input
            type="text"
            id="local-search-input"
            class="form-control validate"
          />
          <label data-error="x" data-success="v" for="local-search-input"
            >关键词</label
          >
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
        <div class="modal fade" id="modalNotice" tabindex="-1" role="dialog" aria-hidden="true"
     style="font-family: 'Ma Shan Zheng', cursive; color: #ffffff;">
    <div class="modal-dialog modal-dialog-scrollable" role="document"
         style="font-family: 'Ma Shan Zheng', cursive;">
        <div class="modal-content" style="border-radius: 6px;">
            <!-- 公告头部 - 响应式设计 -->
            <div class="modal-header text-center"
                 style="padding: 1rem 1.5rem;border-bottom: 1px solid rgba(255,255,255,0.2)">
                <h4 class="modal-title w-100 font-weight-bold"
                    style="font-family: 'Microsoft YaHei', sans-serif;letter-spacing: 1px;text-shadow: 1px 1px 2px rgba(0,0,0,0.2);color: #ffffff;
                           font-size: 1.5rem; /* 默认PC端大小 */
                           /* 移动端适配 */
                           @media (max-width: 768px) {
                               font-size: 1.2rem;
                           }">
                    <div class="notice-title">
                        <i class="fas fa-bullhorn mr-2"> 围栏告示</i>
                    </div>
                    <small style="display: block; font-family: 'STKaiti', serif; font-size: 0.6em; color: #a0a0a0; margin-top: 3px;">
                        旧梦轻拾 · 谨识
                    </small>
                </h4>
            </div>

            <!-- 公告内容区 - 响应式设计 -->
            <div class="modal-body"
                 style="padding: 2rem; /* PC端 */
                        max-height: 70vh;
                        overflow-y: auto;
                        /* 移动端适配 */
                        @media (max-width: 768px) {
                            padding: 1rem;
                            max-height: 60vh;
                        }">
                <!-- 图片容器（响应式设计） -->
                <!--                <div class="announcement-hero"-->
                <!--                     style="margin-bottom: 2rem; /* PC端 */-->
                <!--                            /* 移动端适配 */-->
                <!--                            @media (max-width: 768px) {-->
                <!--                                margin-bottom: 1rem;-->
                <!--                            }">-->
                <!--                    <img src="http://blog.memory-life.icu/%E3%80%90%E5%93%B2%E9%A3%8E%E5%A3%81%E7%BA%B8%E3%80%91%E5%8A%A8%E6%BC%AB-%E5%A4%95%E9%98%B3%E9%93%81%E8%BD%A8.jpg"-->
                <!--                         alt="时光溯洄题图"-->
                <!--                         style="width: 100%; -->
                <!--                                max-height: 400px; /* PC端 */-->
                <!--                                object-fit: cover;-->
                <!--                                border-radius: 4px; -->
                <!--                                box-shadow: 0 2px 12px rgba(0,0,0,0.1);-->
                <!--                                /* 移动端适配 */-->
                <!--                                @media (max-width: 768px) {-->
                <!--                                    max-height: 30vh;-->
                <!--                                }"-->
                <!--                         loading="lazy">-->
                <!--                </div>-->

                <!-- 静态公告列表 - 响应式设计 -->
                <div class="announcement-list">
                    <div class="announcement-item"
                         style="margin-bottom: 2rem; /* PC端 */
                                padding: 2rem;
                                background: rgba(255,255,255,0.05);
                                border-radius: 8px;
                                /* 移动端适配 */
                                @media (max-width: 768px) {
                                    margin-bottom: 1rem;
                                    padding: 1rem;
                                }">
                        <h2 style="color: #d38532;
                                  font-weight: 600;
                                  font-size: 1.5rem; /* PC端 */
                                  margin-bottom: 1.2rem;
                                  letter-spacing: 0.5px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      font-size: 1.2rem;
                                      margin-bottom: 1rem;
                                  }">
                            <i class="fas fa-calendar-check mr-2"></i>时光溯洄
                            <small style="display: block; font-size: 0.6em; color: #b8b8b8;text-align: right;">——
                                晨昏往事</small>
                        </h2>
                        <div style="color: #e0e0e0;
                                  line-height: 1.8; /* PC端 */
                                  font-size: 1.05rem;
                                  letter-spacing: 0.3px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      line-height: 1.6;
                                      font-size: 0.95rem;
                                  }">
                            <!-- 内容保持不变 -->
                            <p style="margin-bottom: 1rem; text-indent: 2em;">你好。</p>
                            <!-- 其余段落内容... -->
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                建站后的第813天，在百忙之中总算又能抽出时间来，对整个博客站点功能做整体的规划及优化完善。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                在刚刚过去的几年时间里，往事皆以笔墨挥毫于时光素笺之上，数百天如一日，故事的书写从未间断过。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-style: italic; color: #b8b8b8;">
                                时光悠悠，日月如流，过往的蹉跎岁月总在不经意间在心间回眸。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-weight: 500; color: #ffffff;">
                                俯仰之间，轻舟已过万重山。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-weight: 500; color: #ffffff;">
                                蹉跎之处，往事皆成云烟散。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                这几年的时光过得太快了，好像过去这段岁月里的所有事情都发生在一瞬间。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                这几年的时光同样太久了，久到那些时日里仿佛囊括了自己的整个前半生。</p>
                            <p style="margin-bottom: 0; text-align: right; font-size: 0.95rem; color: #a0a0a0;">——
                                八百余个昼夜，当时只道是地久天长，如今回望，不过浮光掠影间的一瞬。</p>
                        </div>
                    </div>

                    <!-- 第二个公告项 - 响应式设计 -->
                    <div class="announcement-item"
                         style="margin-bottom: 2rem; /* PC端 */
                                padding: 2rem;
                                background: rgba(255,255,255,0.05);
                                border-radius: 8px;
                                /* 移动端适配 */
                                @media (max-width: 768px) {
                                    margin-bottom: 1rem;
                                    padding: 1rem;
                                }">
                        <h2 style="color: #6cc70b;
                                  font-weight: 600;
                                  font-size: 1.5rem; /* PC端 */
                                  margin-bottom: 1.2rem;
                                  letter-spacing: 0.5px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      font-size: 1.2rem;
                                      margin-bottom: 1rem;
                                  }">
                            <i class="fas fa-book-open mr-2"></i>墨痕新注
                            <small style="display: block; font-size: 0.6em; color: #b8b8b8;text-align: right;">——
                                待起之章</small>
                        </h2>
                        <div style="color: #e0e0e0;
                                  line-height: 1.8; /* PC端 */
                                  font-size: 1.05rem;
                                  letter-spacing: 0.3px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      line-height: 1.6;
                                      font-size: 0.95rem;
                                  }">
                            <!-- 列表内容 - 响应式设计 -->
                            <ul style="padding-left: 1.8rem; /* PC端 */
                                      margin-bottom: 1.5rem;
                                      /* 移动端适配 */
                                      @media (max-width: 768px) {
                                          padding-left: 1.5rem;
                                          margin-bottom: 1.2rem;
                                      }">
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">溯源计划：</span>新增博文"溯源计划"，旨在用先进的数字技术留住过去的旧时光，让家族的记忆在数字云端生长发芽，全站博文数量已达90+。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">围栏告示：</span>自去年夏天站点新增了“评论回复”功能后，至今时隔十余月，在芒种前夕本站久违地上线“围栏告示”功能，本公告栏会不定时更新，持续跟进记录最新站点功能调整日志，更多精彩内容请敬请期待。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">图片查看：</span>最近几周时间里，考虑到图文流量费用收取问题，暂时关闭了七牛云对象存储私有空间访问权限，故博文内的图文无法正常预览，择日考虑开启访问权限。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">壁纸下载：</span>后续计划实现壁纸下载功能，均为个人收集的共150+超高分辨率精美壁纸，提供在线预览以及下载功能。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">阅读体验：</span>规划完善文章内分页功能，并提供“最近更新”的文章列表，计划收录更新率较高的文章，譬如：阳台日记、叙事之外、岁月如歌、游戏人生等等，尽可能多的提升在线浏览和阅读体验。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">友链完善：</span>持续优化完善友链页面，整理归档个人常用的高质量网站合集，无偿分享给有缘人。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">音乐餐厅：</span>历经十余小时不间断调研和尝试，本站成功上线”音乐餐厅”功能，目前仅收录了个人在QQ音乐平台积累的两份歌单，再匆忙也要记得点播一首喜欢的音乐，没有音乐熏陶的心灵终究是充满缺憾的。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">三言两语：</span>每张照片都是时光的便签，随手一贴就记下了那天，本站结合Mamos实现并注入留言板功能，随缘记录那些藏在照片背后的故事。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">旧梦轻拾：</span>更新全站博客文章所属分类，共设有代码锋芒、部署之道、旧梦轻拾、人间片刻等十余种分类。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">方寸之间：</span>博客应用版发布，更便捷的阅读体验来了！现已正式推出独立的桌面应用程序与移动端应用程序，暂时通过网盘和代码库提供安装包。
                                </li>
                                <p style="margin-bottom: 0; text-align: right; font-size: 0.9rem; color: #8a8a8a;">
                                    此公告最后更新于：<span style="color: #6cc70b;">2025/09/30晚</span>
                                </p>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>

            <!-- 公告页脚 - 响应式设计 -->
            <div class="modal-footer"
                 style="border-top: 1px solid rgba(255,255,255,0.2);
                        padding: 1rem 1.5rem; /* PC端 */
                        justify-content: space-between;
                        /* 移动端适配 */
                        @media (max-width: 768px) {
                            padding: 0.8rem;
                        }">
                <small style="color: #ffffff;
                            font-size: 0.9rem; /* PC端 */
                            /* 移动端适配 */
                            @media (max-width: 768px) {
                                font-size: 0.8rem;
                            }">
                    <i class="iconfont icon-pen"></i>
                    <i class="fas fa-info-circle mr-1"></i>芒种前夕 · 旅途第813天
                    · 2025/05/28
                </small>
                <button id="confirm-btn" type="button" class="btn btn-sm" data-dismiss="modal"
                        style="background: #a0a0a0;
                               color: #ffffff;
                               border-radius: 4px;
                               padding: 0.5rem 1.2rem; /* PC端 */
                               border: none;
                               font-size: 0.9rem;
                               /* 移动端适配 */
                               @media (max-width: 768px) {
                                   padding: 0.3rem 0.8rem;
                                   font-size: 0.85rem;
                               }">
                    <i class="fas fa-check mr-1" style="color: #ffffff;">心已阅</i>
                </button>
            </div>
        </div>
    </div>
</div>

<style>
  .notice-title {
    display: flex;
    align-items: center;
    white-space: nowrap;
  }

  .notice-title:before,
  .notice-title:after {
    content: "";
    flex: 1;
    height: 1px;
    background: #ddd; /* 横线颜色 */
    margin: 0 10px; /* 横线与文字的间距 */
  }
</style>


<style>
  /* 响应式模态框宽度 */
  @media (min-width: 992px) {
    #modalNotice .modal-dialog {
      max-width: 800px;
    }
  }

  @media (max-width: 991px) {
    #modalNotice .modal-dialog {
      margin: 0.5rem auto;
    }
  }
</style>

<script>
  // 页面加载完成后执行
  document.addEventListener('DOMContentLoaded', function () {
    // 检查是否首次访问
    if (!localStorage.getItem('hasShownPopup')) {
      // 动态加载notice.ejs内容
      fetch('_partials/notice.ejs')  // 替换为实际路径
        .then(response => response.text())
        .then(html => {
          // 插入到页面body末尾
          document.body.insertAdjacentHTML('beforeend', html);

          // 手动初始化Bootstrap模态框
          $('#modalNotice').modal('show');

          // 标记为已显示
          localStorage.setItem('hasShownPopup', 'true');

          // 监听关闭事件
          $('#modalNotice').on('hidden.bs.modal', function () {
            // 可选的后续处理
          });
        })
        .catch(error => {
          console.error('加载公告栏失败:', error);
          // 备用方案：显示简单弹窗
          const fallbackHTML = `
                <div class="modal-backdrop" style="/* 样式 */">
                    <div class="modal-content">/* 内容 */</div>
                </div>`;
          document.body.insertAdjacentHTML('beforeend', fallbackHTML);
        });
    }
  });
</script>

    

    
  </main>

  <footer>
    <!-- 博客 - 页脚 -->
<div class="footer-inner">
  
    <div class="footer-content">
       <a href="https://hexo.fluid-dev.com/docs/guide/" target="_blank" rel="nofollow noopener"> <span>Memory | 个人文档站点</span> </a>
<i class="iconfont icon-love"></i> <a href="https://hexo.fluid-dev.com/docs/guide/" target="_blank" rel="nofollow noopener"> <span>配置指南 | Hexo Fluid 用户手册</span> </a> 
    </div>
  

  

  
    <!-- 备案信 ICP for China -->
    <div class="beian">
  <span>
    <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">
      京ICP证123456号
    </a>
  </span>
  
    
      <span>
        <a
          href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=12345678"
          rel="nofollow noopener"
          class="beian-police"
          target="_blank"
        >
          
            <span style="visibility: hidden; width: 0">|</span>
            <img src="/blog/img/police_beian.png" alt="police-icon"/>
          
          <span>京公网安备12345678号</span>
        </a>
      </span>
    
  
</div>

  

  

</div>

<!-- 评论框美化 -->
<style>
    #comments .veditor{
        min-height: 20vh;
        background-image: url(http://blog.memory-life.icu/pathway0716.jpg);
        background-size: contain;
        background-repeat: no-repeat;
        background-position: right;
        background-color: rgba(255,255,255,0);
        resize: none;}
</style>

<script>
    //   自定义邮箱审核规则
    document.body.addEventListener('click', function(e) {
        if (e.target.classList.contains('vsubmit')) {
            const email = document.querySelector('input[type=email]');
            const nick = document.querySelector('input[name=nick]');
            const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
            if (!email.value || !nick.value || !reg.test(email.value)) {
                const str = `<div class="valert text-center"><div class="vtext">请填写正确的昵称和邮箱！</div></div>`;
                const vmark = document.querySelector('.vmark');
                vmark.innerHTML = str;
                vmark.style.display = 'block';
                setTimeout(function() {
                    vmark.style.display = 'none';
                    vmark.innerHTML = '';
                }, 2500);
            }
        }
    })
</script>



  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.0/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/blog/js/events.js" ></script>
<script  src="/blog/js/plugins.js" ></script>


  <script  src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var subtitle = document.getElementById('subtitle');
      if (!subtitle || !typing) {
        return;
      }
      var text = subtitle.getAttribute('data-typed-text');
      
        typing(text);
      
    })(window, document);
  </script>







  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.18.2/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init(Object.assign({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      scrollSmooth    : true,
      includeTitleTags: true,
      headingsOffset  : -boardTop,
    }, CONFIG.toc));
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }

    Fluid.events.registerRefreshCallback(function() {
      if ('tocbot' in window) {
        tocbot.refresh();
        var toc = jQuery('#toc');
        if (toc.length === 0 || !tocbot) {
          return;
        }
        if (toc.find('.toc-list-item').length > 0) {
          toc.css('visibility', 'visible');
        }
      }
    });
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));

    Fluid.events.registerRefreshCallback(function() {
      if ('anchors' in window) {
        anchors.removeAll();
        var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
        var res = [];
        for (var item of el) {
          res.push('.markdown-body > ' + item.trim());
        }
        if (CONFIG.anchorjs.placement === 'left') {
          anchors.options.class = 'anchorjs-link-left';
        }
        anchors.add(res.join(', '));
      }
    });
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script  src="/blog/js/local-search.js" ></script>

  <script defer src="/blog/js/leancloud.js" ></script>




    
<script src="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js"></script>



<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/blog/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
